【Dijkstra算法】Roadblocks
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了【Dijkstra算法】Roadblocks,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3100字,纯文字阅读大概需要5分钟。
内容图文
Time Limit: 2000MS | Memory Limit: 65536K | |
Description
Bessie has moved to a small farm and sometimes enjoys returning to visit one of her best friends. She does not want to get to her old home too quickly, because she likes the scenery along the way. She has decided to take the second-shortest rather than the shortest path. She knows there must be some second-shortest path.
The countryside consists of R (1 ≤ R ≤ 100,000) bidirectional roads, each linking two of the N (1 ≤ N ≤ 5000) intersections, conveniently numbered 1..N. Bessie starts at intersection 1, and her friend (the destination) is at intersection N.
The second-shortest path may share roads with any of the shortest paths, and it may backtrack i.e., use the same road or intersection more than once. The second-shortest path is the shortest path whose length is longer than the shortest path(s) (i.e., if two or more shortest paths exist, the second-shortest path is the one whose length is longer than those but no longer than any other path).
Input
Lines 2..R+1: Each line contains three space-separated integers: A, B, and D that describe a road that connects intersections A and B and has length D (1 ≤ D ≤ 5000)
Output
Sample Input
4 4
1 2 100
2 4 200
2 3 250
3 4 100
Sample Output
450
Hint
#include <iostream> #include <cstdio> #include <vector> #include <queue> usingnamespace std; constint MAX_V=5001; constint INF=1e9; struct edge{ int to;//边的出点int cost;//权值}; vector<edge> G[MAX_V];//邻接表 typedef pair<int,int> P;//first是源点到该点的距离,second是当前顶点int dist1[MAX_V];//存最短距离int dist2[MAX_V];//存次短距离int N,R;//N个路口,R条道路void dijkstra(); int main() { int s,w,t; edge e; scanf("%d%d",&N,&R); for(int i=0;i<R;i++){ scanf("%d%d%d",&s,&t,&w); e.to=t-1; e.cost=w; G[s-1].push_back(e); e.to=s-1; G[t-1].push_back(e); } dijkstra(); printf("%d\n",dist2[N-1]); return0; } void dijkstra(){ priority_queue <P,vector<P>,greater<P> >que; fill(dist1,dist1+N,INF); fill(dist2,dist2+N,INF); dist1[0]=0; que.push(P(0,0)); while(!que.empty()){ P p=que.top(); que.pop(); int v=p.second;//新的源点int d=p.first; /*如果旧源点到新源点的距离比旧源点到新源点的距离大, 那么不用执行下面的代码去更新新源点到其他各点的dist1,dist2 因为它算出来的距离肯定比以前算出来的大。 */if(d>dist2[v]) continue; for(int i=0;i<G[v].size();i++){ edge& e=G[v][i]; int d2=d+e.cost; if(dist1[e.to]>d2){///最短距离 swap(d2,dist1[e.to]); que.push(P(dist1[e.to], e.to)); } /* d2大于源点到e.to的最短距离,小于以前计算的次短距离则更新 */if(d2>dist1[e.to]&&d2<dist2[e.to]){///次短距离 dist2[e.to]=d2; que.push(P(dist2[e.to],e.to)); } } } }
参考自http://blog.csdn.net/gemire/article/details/20832199
原文:http://www.cnblogs.com/LuRenJiang/p/7419588.html
内容总结
以上是互联网集市为您收集整理的【Dijkstra算法】Roadblocks全部内容,希望文章能够帮你解决【Dijkstra算法】Roadblocks所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。