首页 > 代码库 > POJ3255
POJ3255
题目链接: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\n",d2[N]); 46 47 return 0; 48 }
POJ3255
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。