The shortest path, written in spfa this time.
# Include <cstdio> # include <cstring> # include <cmath> # include <algorithm> # include <climits> # include <string> # include <iostream> # include <map> # include <cstdlib> # include <list> # include <set> # include <queue> # include <stack> using namespace STD; typedef long ll; const int maxn = 1000 + 5; const int INF = int_max/2; const int maxm = 100000 + 5; int first [maxn], NXT [maxm], U [maxm], V [maxm], W [maxm]; int n, m, X, D1 [maxn], D2 [maxn]; bool vis [maxn]; void spfa (int * V, int * D) {memset (VIS, 0, sizeof (VIS )); for (INT I = 1; I <= N; I ++) d [I] = inf; d [x] = 0; queue <int> q; q. push (x); While (! Q. empty () {int u = Q. front (); q. pop (); vis [u] = false; For (INT I = first [u]; I! = 0; I = NXT [I]) {If (d [V [I]> d [u] + W [I]) {d [V [I] = d [u] + W [I]; If (! Vis [V [I]) {vis [V [I] = true; q. push (V [I]) ;}}}} void Adde (int u, int I) {NXT [I] = first [u]; first [u] = I;} int main () {While (scanf ("% d", & N, & M, & X )! = EOF) {memset (first, 0, sizeof (first); memset (NXT, 0, sizeof (NXT); For (INT I = 1; I <= m; I ++) {scanf ("% d", & U [I], & V [I], & W [I]); ADDE (U [I], I);} spfa (v, D1); memset (first, 0, sizeof (first); memset (NXT, 0, sizeof (NXT); For (INT I = 1; I <= m; I ++) {Adde (V [I], I);} spfa (u, d2); int ans = 0; For (INT I = 1; I <= N; I ++) ans = max (ANS, d1 [I] + D2 [I]); printf ("% d \ n", ANS);} return 0 ;}