POJ3255 次短路

3255

利用最短路的思想,最短路是维护每个节点到起点的最短距离,每次确定未确定里面距离最短的那个节点的最短距离,

根据次短路定义,从S到u的第二短的路线,那么只要维护一下次短路就可以了。新的节点次短路要么是S->u最短路+u->v

要么是 S->u次短路+ u->v  就是{d[e.to],d2[e.to] c+e.w}里面最短的是最短路 第二小的是次短路

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <set>
 5 #include <algorithm>
 6 #include <map>
 7 #include <queue>
 8 #include<vector>
 9 #define maxn 5010
10 #define maxm 12500010
11 #define INF 0x3fffffff
12 using namespace std;
13 struct edge {
14     int to,w;
15     edge(){}
16     edge(int _to,int _w){
17         to=_to;w=_w;
18     }
19 };
20 typedef pair<int,int> P;
21 int V;
22 vector<edge> G[maxn];
23 int d[maxn];//最短路
24 int d2[maxn];//次短路
25 void dijkstra(int s){
26     priority_queue<P,vector<P>,greater<P> >q;
27     for(int i=0;i<V;++i){
28         d[i]=INF;
29         d2[i]=INF;
30     }
31     d[s]=0;
32     q.push(P(d[s],s));
33     while(!q.empty()){
34         P p = q.top();
35         q.pop();
36         int v = p.second,c=p.first;
37         if(d2[v]<p.first)continue;
38         for(int i=0;i<G[v].size();++i){
39             edge e = G[v][i];
40             int c2 = c+e.w;//新的权值
41             if(d[e.to]>c2){//维护最短路
42                 swap(d[e.to],c2);
43                 q.push(P(d[e.to],e.to));
44             }
45             if(d2[e.to]>c2&&d[e.to]<c2){//维护次短路
46                 d2[e.to]=c2;
47                 q.push(P(d2[e.to],e.to));
48             }
49         }
50     }
51 }
52 int main (){
53     int n,m;
54     while(scanf("%d%d",&n,&m)!=EOF){
55         for(int i=0;i<n;++i)G[i].clear();
56         V=n;
57         if(n==0&&m==0)break;
58         int u,v,w;
59         for(int i=0;i<m;++i){
60             scanf("%d%d%d",&u,&v,&w);
61             G[u-1].push_back(edge(v-1,w));
62             G[v-1].push_back(edge(u-1,w));
63         }
64         dijkstra(0);
65         printf("%d
",d2[n-1]);
66     }
67 }
View Code
原文地址:https://www.cnblogs.com/shuzy/p/3783154.html