码迷,mamicode.com
首页 > 其他好文 > 详细

POJ3255

时间:2017-08-06 12:34:18      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:max   代码   scanf   挑战   c代码   cond   算法   names   size   

题目链接: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

标签:max   代码   scanf   挑战   c代码   cond   算法   names   size   

原文地址:http://www.cnblogs.com/Blogggggg/p/7294225.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!