本文地址:http://www.javashuo.com/article/p-myjcygrr-ew.htmlhtml
題目名稱:Roadblocksios
連接:http://poj.org/problem?id=3255ide
題意:有 N 個點,R條邊,計算從 1 出發到 N的次短路長度,次短路是指長度比那些最短路長的路徑。
spa
思路:emmm,最短路是每次保存最短的點,那咱們每次保存最短和次短就行了code
代碼以下:htm
1 #include<cstdio>
2 #include<iostream>
3 #include<queue>
4 using namespace std; 5 typedef pair<int,int> P; 6 const int INF = 0x3f3f3f3f; 7 const int maxn = 5005; 8 struct Edge{ 9 int v, w; 10 int nxt; 11 }edge[100005 * 2]; 12 int head[maxn]; 13 int n, r; 14 int cnt, dist1[maxn], dist2[maxn]; 15 void add_edge(int u, int v, int w){ 16 edge[cnt].v = v; 17 edge[cnt].w = w; 18 edge[cnt].nxt = head[u]; 19 head[u] = cnt++; 20 } 21 void init(){ 22 cnt = 0; 23 fill(head, head + n + 1, -1); 24 fill(dist1, dist1 + n + 1, INF); 25 fill(dist2, dist2 + n + 1, INF); 26 } 27 void spfa(int s){ 28 priority_queue<P, vector<P>, greater<P> > Q; 29 dist1[s] = 0; 30 Q.push(P(0, 1)); 31 while(!Q.empty()){ 32 P p = Q.top(); Q.pop(); 33 int v = p.second, w = p.first; 34 if(dist2[v] < w) continue; 35 for(int i = head[v]; i != -1; i = edge[i].nxt){ 36 Edge &e = edge[i]; 37 int d = w + e.w; 38 if(dist1[e.v] > d){ 39 swap(dist1[e.v], d); 40 Q.push(P(dist1[e.v], e.v)); 41 } 42 if(dist2[e.v] > d && dist1[e.v] < d){ 43 dist2[e.v] = d; 44 Q.push(P(dist2[e.v], e.v)); 45 } 46 } 47 } 48 } 49 int main(){ 50
51 scanf("%d%d", &n, &r); 52 init(); 53 for(int i = 1; i <= r; i++){ 54 int a,b,d; 55 scanf("%d%d%d", &a, &b, &d); 56 add_edge(a, b, d); 57 add_edge(b, a, d); 58 } 59 spfa(1); 60 printf("%d\n", dist2[n]); 61 return 0; 62 }