poj - 3225 Roadblocks(次短路)
http://poj.org/problem?id=3255
bessie 有时会去拜访她的朋友,但是她不想走最快回家的那条路,而是想走一条比最短的路长的次短路。
城镇由R条双向路组成,有N个路口。标号为1到N,问1号路口到N号路口的次短路长度是多少?次短路是
比最短路长度长的次短的路径。同一条边可以经过多次。
到某个顶点v的次短路要么帅到其他顶点u的最短路在加上u-v的边,要么是到u的次短路再加上u-v的边,
因此所需要求的就是到所有顶点的最短路和次短路,因此,对于每个顶点,我们记录的不仅仅是最短距离,
还有次短的距离,接下去只要用dijkstra算法相同的做法,不断更新这两个距离就能求出次短路了。
1 /* *********************************************** 2 Author : zch 3 Created Time :2015/5/13 8:16:45 4 File Name :a.cpp 5 ************************************************ */ 6 7 #include <cstdio> 8 #include <cstring> 9 #include <iostream> 10 #include <algorithm> 11 #include <vector> 12 #include <queue> 13 #include <set> 14 #include <map> 15 #include <string> 16 #include <cmath> 17 #include <cstdlib> 18 #include <ctime> 19 using namespace std; 20 const int maxn = 5010; 21 const int INF = 1000000000; 22 23 int N, R; 24 struct edge { 25 int to,cost; 26 edge() {} 27 edge(int x,int y) { 28 to=x; 29 cost=y; 30 } 31 }; 32 typedef pair<int,int>P; 33 vector<edge>G[maxn]; 34 int dist[maxn]; 35 int dist2[maxn]; 36 37 void dijkstra(int s) { 38 priority_queue<P,vector<P>,greater<P> >que; 39 for(int i=0;i<=N;i++) dist[i]=INF; 40 for(int i=0;i<=N;i++) dist2[i]=INF; 41 dist[s]=0; 42 que.push(P(0,s)); 43 44 while(!que.empty()) { 45 P p=que.top(); que.pop(); 46 int v=p.second, d=p.first; 47 if(dist2[v]<d) continue; //v的次短距离比d还小 48 for(int i=0;i<G[v].size();++i) { 49 edge e=G[v][i]; 50 //cout<<e.to<<endl; 51 int d2=d+e.cost; 52 if(dist[e.to]>d2) { //更新 最短距离 53 swap(dist[e.to],d2); 54 que.push(P(dist[e.to],e.to)); 55 } 56 if(dist2[e.to]>d2&&dist[e.to]<d2) { //更新次短距离 57 dist2[e.to]=d2; 58 //cout<<d2<<endl; 59 que.push(P(dist2[e.to],e.to)); 60 } 61 } 62 } 63 printf("%d\n",dist2[N]); 64 } 65 int main() 66 { 67 //freopen("a.txt","r",stdin); 68 //freopen("b.txt","w",stdout); 69 int a,b,c; 70 scanf("%d%d",&N,&R); 71 for(int i=0;i<R;++i) { 72 scanf("%d%d%d",&a,&b,&c); 73 G[a].push_back(edge(b,c)); 74 G[b].push_back(edge(a,c)); 75 } 76 dijkstra(1); 77 return 0; 78 }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。