【洛谷 p3371】模板-单源最短路径(图论)

题目:给出一个有向图,请输出从某一点出发到所有点的最短路径长度。

解法:spfa算法。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<queue>
 6 using namespace std;
 7 typedef long long LL;
 8 
 9 const int N=10010,M=500010;
10 const LL INF=2147483647;
11 int n,m,st,len=0;
12 int vis[N],last[N];
13 LL dis[N];
14 struct edge{int x,y,next;LL d;}a[2*M];
15 queue<int> q;
16 
17 void ins(int x,int y,LL d)
18 {
19     a[++len].x=x,a[len].y=y,a[len].d=d;
20     a[len].next=last[x],last[x]=len;
21 }
22 void spfa()
23 {
24     for (int i=1;i<=n;i++) dis[i]=INF;
25     memset(vis,0,sizeof(vis));
26     while (!q.empty()) q.pop();
27     dis[st]=0, vis[st]=1;
28     q.push(st);
29     while (!q.empty())
30     {
31       int x=q.front();
32       q.pop(); vis[x]=0;
33       for (int i=last[x];i;i=a[i].next)
34       {
35         int y=a[i].y;
36         if (dis[x]+a[i].d<dis[y])
37         {
38           dis[y]=dis[x]+a[i].d;
39           if (!vis[y]) vis[y]=1, q.push(y);
40         }
41       }
42     }
43 }
44 int main()
45 {
46     scanf("%d%d%d",&n,&m,&st);
47     int x,y; LL d;
48     memset(last,-1,sizeof(last));
49     for (int i=1;i<=m;i++)
50     {
51       scanf("%d%d%lld",&x,&y,&d);
52       ins(x,y,d);
53     }
54     spfa();
55     for (int i=1;i<=n;i++)
56       printf("%lld ",dis[i]);
57     printf("
");
58     return 0;
59 }