2

洛谷 P3371 【模板】单源最短路径(弱化版) 题解(SPFA)

题目描述

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

输入格式

第一行包含三个整数 n,m,s,分别表示点的个数、有向边的个数、出发点的编号。

接下来 m 行每行包含三个整数 u,v,w,表示一条 uv 的,长度为 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 }

 

posted @ 2021-08-26 11:01  Zˇx  阅读(44)  评论(0)    收藏  举报
Live2D