2

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

题目描述

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

输入格式

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

接下来 m 行每行包含三个整数 u,v,w,表示一条 uv 的,长度为 w 的边。

输出格式

输出一行 n 个整数,第 i 个表示 s 到第 i 个点的最短路径,若不能到达则输出 2^{31}-1

AC代码 (dijkstra)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 priority_queue< pair <int,int > >q;
 5 int n,m,s,d[5000010];
 6 bool vis[5000010];
 7 int head[5000010],to[5000010],next[5000010],edge[5000010],cnt;
 8 
 9 void add(int x,int y,int v)
10 {
11     cnt++;
12     to[cnt]=y;
13     edge[cnt]=v;
14     next[cnt]=head[x];
15     head[x]=cnt;
16 }
17 
18 void dijkstra()
19 {
20     for (int i=1;i<=n;i++)
21         d[i]=2147483647;
22     memset(vis,0,sizeof(vis));
23     d[s]=0;
24     q.push(make_pair(0,s));
25     while (q.size())
26     {
27         int x=q.top().second;
28         q.pop();
29         if (vis[x])
30             continue;
31         vis[x]=1;
32         for (int i=head[x];i;i=next[i])
33         {
34             int y=to[i],v=edge[i];
35             if (d[y]>d[x]+v)
36             {
37                 d[y]=d[x]+v;
38                 q.push(make_pair(-d[y],y));
39             }
40         }
41     }
42 }
43 
44 int main()
45 {
46     scanf("%d%d%d",&n,&m,&s);
47     int x,y,v;
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     dijkstra();
55     
56     for (int i=1;i<=n;i++)
57         printf("%d ",d[i]);
58     return 0;
59 }

 

posted @ 2021-08-26 10:13  Zˇx  阅读(45)  评论(0)    收藏  举报
Live2D