洛谷 P3371 【模板】单源最短路径(弱化版) 题解(SPFA)
题目描述
如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。
输入格式
第一行包含三个整数 n,m,s,分别表示点的个数、有向边的个数、出发点的编号。
接下来 m 行每行包含三个整数 u,v,w,表示一条 u→v 的,长度为 w 的边。
输出格式
输出一行 n 个整数,第 i 个表示 s 到第 i 个点的最短路径,若不能到达则输出 2^{31}-1。
AC代码 (SPFA)
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int n,m,s,x,y,v,cnt; 5 int d[1000001],vis[1000001],head[1000001],to[1000001],next[1000001],edge[1000001]; 6 queue<int> q; 7 8 void add(int x,int y,int v) 9 { 10 cnt++; 11 to[cnt]=y; 12 edge[cnt]=v; 13 next[cnt]=head[x]; 14 head[x]=cnt; 15 } 16 17 void SPFA() 18 { 19 for (int i=1;i<=n;i++) 20 d[i]=2147483647; 21 q.push(s); 22 d[s]=0; 23 vis[s]=1; 24 while (q.size()) 25 { 26 int x=q.front(); 27 q.pop(); 28 vis[x]=0; 29 for (int i=head[x];i;i=next[i]) 30 { 31 int y=to[i],v=edge[i]; 32 if (d[y]>d[x]+v) 33 { 34 d[y]=d[x]+v; 35 if (vis[y]==0) 36 { 37 vis[y]=1; 38 q.push(y); 39 } 40 } 41 } 42 } 43 } 44 45 int main() 46 { 47 scanf("%d%d%d",&n,&m,&s); 48 for (int i=1;i<=m;i++) 49 { 50 scanf("%d%d%d",&x,&y,&v); 51 add(x,y,v); 52 } 53 54 SPFA(); 55 56 for (int i=1;i<=n;i++) 57 printf("%d ",d[i]); 58 return 0; 59 }