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 }

 

posted @ 2017-08-06 11:21  Blogggggg  阅读(140)  评论(0编辑  收藏  举报