PS: Secondary short-circuit problem.
#include <iostream> #include <cstring> #include <algorithm> #include <queue> #include < cstdio> #include <vector> #include <cmath>const int INF = 0x3ffffff;using namespace Std;const int MAXN = 5100 ; struct Edge {int to, cost;}; typedef pair<int, int> p;int dist[maxn];int dist2[maxn];vector<edge> g[maxn];//accepted3676k188msg++ 1575b2014-06-04 20:16:12int N, R;priority_queue<p, Vector<p>, greater<p> > Que;void Solve () {while (! Que.empty ()) Que.pop (); Fill (Dist, dist+n, INF); Fill (Dist2, dist2+n, INF); Que.push (P (0,0)); while (!que.empty ()) {p p = que.top (); Que.pop (); int v = p.second, d = p.first; if (Dist2[v] < D) continue; for (int i = 0; i < (int) g[v].size (); i++) {Edge &e = G[v][i]; int D2 = d + e.cost; if (Dist[e.to] > D2) {swap (dist[e.to], D2); Que.push (P (dist[e.to], e.to)); }if (dist2[e.to] > D2 && dist[e.to] < D2) {dist2[e.to] = D2; Que.push (P (dist2[e.to], e.to)); }}} printf ("%d\n", Dist2[n-1]);} int main () {edge in; int x, y, W; while (scanf ("%d%d", &n, &r)! = EOF) {for (int i = 0; i < N; i++) g[i].clear (); for (int i = 1; I <= R; i++) {scanf ("%d%d%d", &x, &y, &w); x--; y--; in.to = y; In.cost = W; G[x].push_back (in); in.to = x; G[y].push_back (in); } solve (); } return 0;}