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*/

 

posted @ 2019-03-08 20:48  hemeiwolong  阅读(184)  评论(0编辑  收藏  举报