3268

1 // include file
2 #include <cstdio>
3 #include <cstdlib>
4 #include <cstring>
5 #include <cmath>
6 #include <cctype>
7 #include <ctime>
8
9 #include <iostream>
10 #include <sstream>
11 #include <fstream>
12 #include <iomanip>
13 #include <bitset>
14 #include <strstream>
15
16 #include <algorithm>
17 #include <string>
18 #include <vector>
19 #include <queue>
20 #include <set>
21 #include <list>
22 #include <functional>
23
24 using namespace std;
25
26 // typedef
27 typedef long long LL;
28 typedef unsigned long long ULL;
29 typedef __int64 Bint;
30
31 //
32 #define read freopen("in.txt","r",stdin)
33 #define write freopen("out.txt","w",stdout)
34 #define FORi(a,b,c) for(int i=(a);i<(b);i+=c)
35 #define FORj(a,b,c) for(int j=(a);j<(b);j+=c)
36 #define FORk(a,b,c) for(int k=(a);k<(b);k+=c)
37 #define FORp(a,b,c) for(int p=(a);p<(b);p+=c)
38 #define FORii(a,b,c) for(int ii=(a);ii<(b);ii+=c)
39 #define FORjj(a,b,c) for(int jj=(a);jj<(b);jj+=c)
40 #define FORkk(a,b,c) for(int kk=(a);kk<(b);kk+=c)
41
42 #define FF(i,a) for(int i=0;i<(a);i+++)
43 #define FFD(i,a) for(int i=(a)-1;i>=0;i--)
44 #define Z(a) (a<<1)
45 #define Y(a) (a>>1)
46
47 const double eps = 1e-6;
48 const double INFf = 1e10;
49 const int INFi = 1000000000;
50 const double Pi = acos(-1.0);
51
52 template<class T> inline T sqr(T a){return a*a;}
53 template<class T> inline T TMAX(T x,T y)
54 {
55 if(x>y) return x;
56 return y;
57 }
58 template<class T> inline T TMIN(T x,T y)
59 {
60 if(x<y) return x;
61 return y;
62 }
63 template<class T> inline void SWAP(T &x,T &y)
64 {
65 T t = x;
66 x = y;
67 y = t;
68 }
69 template<class T> inline T MMAX(T x,T y,T z)
70 {
71 return TMAX(TMAX(x,y),z);
72 }
73
74
75 // code begin
76 #define MAXN 1010
77 int mp1[MAXN][MAXN];
78 int mp2[MAXN][MAXN];
79 int dst[MAXN];
80 bool used[MAXN];
81 int at[MAXN];
82 int N,M,X;
83
84
85 void SP_dijkstra(int st,int mp[][MAXN])
86 {
87 memset(used,0,sizeof(used));
88 used[st] = true;
89 FORi(1,N+1,1)
90 {
91 if(mp[st][i]!=0) dst[i] = mp[st][i];
92 else dst[i] = INFi;
93 }
94
95 int k;
96 int kmin;
97 do
98 {
99 k = -1;
100 kmin = INFi;
101 FORi(1,N+1,1)
102 {
103 if(!used[i])
104 {
105 if(dst[i]<kmin)
106 {
107 kmin = dst[i];
108 k = i;
109 }
110 }
111 }
112
113 if(k==-1) break;
114 at[k]+=kmin;
115 used[k] = true;
116 FORi(1,N+1,1)
117 {
118 if(!used[i])
119 {
120 if(mp[k][i]!=0)
121 {
122 if( dst[k]+mp[k][i]<dst[i] )
123 dst[i] = dst[k]+mp[k][i];
124 }
125 }
126 }
127 }while(true);
128
129 }
130
131 int main()
132 {
133 read;
134 write;
135 int s,e,t;
136 while(scanf("%d %d %d",&N,&M,&X)!=-1)
137 {
138 memset(mp1,0,sizeof(mp1));
139 memset(mp2,0,sizeof(mp2));
140 while(M--)
141 {
142 scanf("%d %d %d",&s,&e,&t);
143 mp1[s][e] = t;
144 mp2[e][s] = t;
145 }
146 memset(at,0,sizeof(at));
147 SP_dijkstra(X,mp1);
148 SP_dijkstra(X,mp2);
149 int ans = 0;
150 FORi(1,N+1,1)
151 {
152 if(at[i]>ans)
153 ans=at[i];
154 }
155 printf("%d\n",ans);
156 }
157 return 0;
158 }
posted @ 2011-03-09 21:04  AC2012  阅读(249)  评论(0编辑  收藏  举报