#include <bits/stdc++.h> using namespace std; #define INF 0x7ffffff typedef pair<int, int> P; #define maxn 100000+10 struct edge { int to; int cost; edge(){} edge(int to_, int cost_) { to = to_; cost = cost_; } }; int d[maxn], d2[maxn]; int N, R; vector<edge> G[maxn]; void dijkstra(int s) { priority_queue<P, vector<P>, greater<P> >que; fill(d, d+N, INF); fill(d2, d2+N, INF); d[s] = 0; que.push(P(0,s)); while(!que.empty()) { P p = que.top(); que.pop(); int v = p.second, dist = p.first; if(d2[v] < dist) continue; for(int i=0; i<G[v].size(); i++) { edge e = G[v][i]; int a = dist + e.cost; if(d[e.to] > a) { swap(d[e.to] , a); que.push(P(d[e.to], e.to)); } if(d2[e.to] > a && d[e.to] < a) { d2[e.to] = a; que.push(P(d2[e.to], e.to)); } } } } int main() { cin>>N>>R; int u, v, w; for(int i=0; i<R; i++) { cin>>u>>v>>w; G[u-1].push_back(edge(v-1, w)); G[v-1].push_back(edge(u-1, w)); } dijkstra(0); cout<<d2[N-1]<<endl; return 0; }
原文地址:http://blog.csdn.net/dojintian/article/details/44725663