洛谷 P3371 【模板】单源最短路径(弱化版) 题解 (dijkstra)
题目描述
如题,给出一个有向图,请输出从某一点出发到所有点的最短路径长度。
输入格式
第一行包含三个整数 n,m,s,分别表示点的个数、有向边的个数、出发点的编号。
接下来 m 行每行包含三个整数 u,v,w,表示一条 u→v 的,长度为 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 }