[洛谷3371]模板单源最短路径

Posted skylee的OI博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[洛谷3371]模板单源最短路径相关的知识,希望对你有一定的参考价值。

思路:Dijkstra+堆优化

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<vector>
 4 #include<ext/pb_ds/priority_queue.hpp>
 5 #define dis first
 6 #define to second
 7 #define Edge std::pair<int,int>
 8 #define inf 0x7fffffff
 9 #define M 500001
10 #define N 10001
11 int n,m,s;
12 int d[N];
13 struct Graph {
14     std::vector<Edge> e[M];
15     void add(int f,int g,int w) {
16         e[f].push_back((Edge){w,g});
17     }
18 };
19 Graph g;
20 inline void dijkstra() {
21     __gnu_pbds::priority_queue<Edge,std::greater<Edge> > q;
22     __gnu_pbds::priority_queue<Edge,std::greater<Edge> >::point_iterator a[n+1];
23     for(int i=1;i<=n;i++) if(i!=s) a[i]=q.push((Edge){d[i]=inf,i});
24     a[s]=q.push((Edge){d[s]=0,s});
25     while(!q.empty()) {
26         Edge x=q.top();
27         q.pop();
28         if(x.dis==inf) continue;
29         int u=x.to;
30         for(std::vector<Edge>::iterator i=g.e[u].begin();i<g.e[u].end();i++) {
31             Edge& e=*i;
32             if(d[u]+e.dis<d[e.to]) {
33                 d[e.to]=d[u]+e.dis;
34                 q.modify(a[e.to],(Edge){d[e.to],e.to});
35             }
36         }
37     }
38 }
39 int main() {
40     scanf("%d%d%d",&n,&m,&s);
41     for(int i=1;i<=m;i++) {
42         int a,b,w;
43         scanf("%d%d%d",&a,&b,&w);
44         if(a==b) continue;
45         g.add(a,b,w);
46     }
47     dijkstra();
48     for(int i=1;i<=n;i++) {
49         printf("%d ",d[i]);
50     }
51     printf("\n");
52     return 0;
53 }

 

以上是关于[洛谷3371]模板单源最短路径的主要内容,如果未能解决你的问题,请参考以下文章

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

洛谷 P3371 模板单源最短路径

洛谷 P3371 模板单源最短路径

[模板]洛谷T3371 单源最短路径 SPFA+手工队列类

洛谷 P3371 单源最短路径(Java版)

普及组模板——单源最短路径