首页 > 代码库 > [洛谷3371]【模板】单源最短路径
[洛谷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 50000110 #define N 1000111 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]【模板】单源最短路径
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。