Dijkstra求最短路
Posted Rgylin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dijkstra求最短路相关的知识,希望对你有一定的参考价值。
思想
比如求一点到图中所有点的距离最短路径
步骤
- 选择一点比如从一开始,一开始初始化路径dist[i]为无穷大,初始化从1点到大其他点的最短路径
- 设置一个标记数组记录已经纳入最短距离的集合中,从未被标记的点中选择到达它距离最短的点,并标记,防止重复选取
- 用选出的点来更新到达其他点的最短距离 取min操作
一开始已经选了一个初始化的点 所以再选取n-1个即可 所以重复n-1次
选的过程
– 以一道题目为例
https://www.acwing.com/activity/content/problem/content/918/
代码如下
#include <cstring>
#include <iostream>
using namespace std;
const int N = 506;
const int Maxn= 10005;
int dist[N] ; //最短路距离
int g[N][N] ;
bool st[N];
int n,m;
int res;
int digistr()
for(int i=1;i<=n;i++)dist[i]=Maxn;
dist[1]=0; //从1开始遍历
//初始化 点i到 其他点的距离
for(int i=2;i<=n;i++)
if( g[1][i]!= Maxn)
dist[i] = g[1][i];
int t=0;
for(int i=0;i<n-1;i++)//迭代n-1次
int mins = Maxn;
for(int j=1;j<=n;j++)
if(!st[j] && mins > dist[j])
t= j;
mins= dist[j];
st[t] = true;
for(int j=1;j<=n ;j++)
dist[j] =min(dist[j],dist[t]+g[t][j]);
if(dist[n] ==Maxn ) return -1;
else return dist[n];
int main()
int a,b,c;
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
g[i][j] =Maxn;
while (m --)
cin>>a>>b>>c;
g[a][b]= min(g[a][b],c); //因为有多条边所以取最小值
res= digistr();
cout<<res<<endl;
return 0;
以上是关于Dijkstra求最短路的主要内容,如果未能解决你的问题,请参考以下文章