首页 > 代码库 > poj3255

poj3255

技术分享

技术分享

 

技术分享
 1 #include<iostream>
 2 #include<queue>
 3 #define INF 1000000
 4 using namespace std;
 5 typedef pair<int,int> P; //first是最短距离,second是顶点编号
 6 struct edge
 7 {
 8     int to,cost;
 9     edge(int tt,int cc)
10     {
11         to=tt;
12         cost=cc;
13     }
14 };
15 const int maxn=5010;
16 const int maxr=100010;
17 int n,r;
18 //图的邻接表表示
19 vector<edge> G[maxr];
20 int dist[maxn];
21 int dist2[maxn];
22 void solve()
23 {
24     //把每个顶点当前的最短距离用堆维护
25     //每次从堆中取出的最小值就是下一次要使用的顶点
26     //在每次更新时往堆里插入当前最短距离和顶点的值对
27     //当取出的最小值不是最短距离的话,就丢弃这个值
28     priority_queue<P,vector<P>,greater<P> > que;
29     fill(dist,dist+n,INF);
30     fill(dist2,dist2+n,INF);
31     dist[0]=0;
32     que.push(P(0,0));
33     while(!que.empty())
34     {
35         P p=que.top();
36         que.pop();
37         int v=p.second,d=p.first;
38         if(d>dist2[v]) continue;
39         for(int i=0; i<G[v].size(); i++)
40         {
41             edge e=G[v][i];
42             int d2=d+e.cost;
43             if(d2<dist[e.to])
44             {
45                 swap(d2,dist[e.to]);
46                 que.push(P(dist[e.to],e.to));
47             }
48             if(d2<dist2[e.to]&&dist[e.to]<d2) //次短路
49             {
50                 dist2[e.to]=d2;
51                 que.push(P(dist2[e.to],e.to));
52             }
53         }
54     }
55 
56     /*
57     for(int i=0; i<n; i++)
58     {
59         cout<<dist[i]<<" "<<dist2[i]<<endl;
60     }*/
61     cout<<dist2[n-1]<<endl;
62 }
63 int main()
64 {
65     cin>>n>>r;
66     int from,to,cost;
67     for(int i=0; i<r; i++)
68     {
69         cin>>from>>to>>cost;
70         from--;
71         to--;
72         G[from].push_back(edge(to,cost));
73         G[to].push_back(edge(from,cost));
74     }
75     solve();
76     return 0;
77 }
View Code

 

poj3255