SPFA 算法详解
参考:https://blog.csdn.net/sxy201658506207/article/details/78779045
前向星:https://www.cnblogs.com/Renyi-Fan/p/7508063.html
https://blog.csdn.net/lookqaq/article/details/81304637
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e4; 4 const int inf=0x3f3f3f3f; 5 int dis[N],tu[N][N],b[N][N];//注意不能这样初始化:dis[N]={inf};!!dis[i]存1点到各点的最短距离, 6 bool vis[N];//tu[]存各点间的边,vis【i】标记i点是否在队列里 7 int n,m; 8 void spfa(int s)//spfa算法 9 { 10 for (int i=0;i<=n;i++) 11 { 12 dis[i]=inf; 13 }//dis【】到各点的距离先初始化为一个极大的值 14 memset(vis,0,sizeof(vis)); 15 dis[s]=0; vis[s]=1; 16 queue<int> qu; 17 qu.push(s);//出发点先入队 18 while (!qu.empty()) 19 { 20 int head=qu.front(); 21 qu.pop();//要记得pop! 22 vis[head]=0; 23 for (int i=1;i<=b[head][0];i++)//遍历和该点连接的所有边 24 { 25 int v=b[head][i],tmp=dis[head]+tu[head][v]; 26 if (dis[v]>tmp) 27 { 28 dis[v]=tmp;//更新最短距离 29 if (vis[v]==0)//如果该连接点不在队列里则入队 30 { 31 qu.push(v); 32 vis[v]=1; 33 } 34 } 35 } 36 } 37 } 38 int main() 39 { 40 cin>>n>>m; 41 int st,to,val; 42 for (int i=0;i<m;i++) 43 { 44 cin>>st>>to>>val; 45 b[st][0]++;//b[st][0]存以st为出发点的边数 46 b[st][b[st][0]]=to; 47 tu[st][to]=val; 48 } 49 spfa(0);//这里以0点为出发点 50 for (int i=1;i<n;i++) 51 { 52 cout<<dis[i]<<endl; 53 } 54 55 return 0; 56 } 57 /*测试样例(参考博客中的数据) 58 5 7 59 0 4 10 60 0 1 2 61 1 4 7 62 3 4 5 63 4 2 6 64 1 2 3 65 2 3 4 66 */ 67 /* 68 2 69 5 70 9 71 9*/