题目链接:http://poj.org/problem?id=3255
解题思路:
昨晚两点多睡不着翻起来刷《挑战》的题,结果遇到这道求次短路的题,一脸懵逼。想了半小时没什么思路就看他的解答了。具体看代码吧,讲解可以参考《挑战程序设计竞赛》P119。其实还是Dijkstra算法的变形。但是这个变形确实不太好想。
AC代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <queue> 5 using namespace std; 6 typedef pair<int,int> P; 7 const int maxn=5000+3,inf=0x7ffffff; 8 struct edge{ 9 int to,cost; 10 }; 11 vector<edge> G[maxn]; 12 int d[maxn],d2[maxn]; 13 int main() 14 { 15 int N,R,A,B,D; 16 scanf("%d%d",&N,&R); 17 while(R--){ 18 scanf("%d%d%d",&A,&B,&D); 19 edge temp; 20 temp.cost=D; 21 temp.to=B; G[A].push_back(temp); 22 temp.to=A; G[B].push_back(temp); 23 } 24 priority_queue<P,vector<P>,greater<P> > que; 25 for(int i=1;i<=N;i++) d[i]=d2[i]=inf; 26 d[1]=0; 27 que.push(P(0,1)); 28 while(!que.empty()){ 29 P p=que.top(); que.pop(); 30 int v=p.second; 31 if(d2[v]<p.first) continue; //如果次短路都比此短,那么就没有更新的必要了 32 for(int i=0;i<G[v].size();i++){ 33 edge e=G[v][i]; 34 int dt=p.first+e.cost; //一开始那个p.first被我携程d[v]了,很显然有bug 35 if(d[e.to]>dt){ 36 swap(d[e.to],dt); 37 que.push(P(d[e.to],e.to)); 38 } 39 if(d2[e.to]>dt&&dt>d[e.to]){ 40 d2[e.to]=dt; 41 que.push(P(d2[e.to],e.to)); 42 } 43 } 44 } 45 printf("%d ",d2[N]); 46 47 return 0; 48 }