D - Silver Cow Party
1 //两次dijkstra 2 #include <iostream> 3 #include <algorithm> 4 5 #define Faster ios::sync_with_stdio(false),cin.tie(0) 6 #define Read freopen("in.txt","r",stdin),freopen("out.txt","w",stdout) 7 #define Close fclose(stdin),fclose(stdout) 8 const int INF = 0xffffff; 9 const int maxn = 1005; 10 using namespace std; 11 12 int mp[maxn][maxn]; 13 bool v[maxn]; 14 bool v2[maxn]; 15 int dis[maxn]; 16 int dis2[maxn]; 17 18 int n; 19 20 void dijkstra(int x){ 21 for(int i = 1;i <= n;i++){ 22 dis[i] = mp[x][i]; 23 dis2[i] = mp[i][x]; 24 v[i] = true; 25 v2[i] = true; 26 } 27 dis[x] = dis2[x] = 0; 28 v[x] = v2[x] = false; 29 30 for(int i = 1;i < n;i++){ 31 int Min = INF; 32 int p; 33 for(int j = 1;j <= n;j++){ 34 if(v[j] && dis[j] < Min){ 35 Min = dis[j]; 36 p = j; 37 } 38 } 39 if(Min == INF) 40 break; 41 v[p] = false; 42 for(int j = 1;j <= n;j++){ 43 if(v[j] && dis[j] > dis[p] + mp[p][j]) 44 dis[j] = dis[p] + mp[p][j]; 45 } 46 } 47 48 for(int i = 0;i < n;i++){ 49 int Min = INF; 50 int p; 51 for(int j = 1;j <= n;j++){ 52 if(v2[j] && dis2[j] < Min){ 53 Min = dis2[j] ; 54 p = j; 55 } 56 } 57 if(Min == INF) 58 break; 59 v2[p] = false; 60 for(int j = 1;j <= n;j++){ 61 if(v2[j] && dis2[j] > dis2[p] + mp[j][p]) 62 dis2[j] = dis2[p] + mp[j][p]; 63 } 64 } 65 } 66 67 int main(){ 68 Faster; 69 int m, k; 70 cin >> n >> m >> k; 71 for(int i = 0;i <= n;i++) 72 for(int j = 0;j <= n;j++){ 73 mp[i][j] = INF; 74 if(i == j) 75 mp[i][j] = 0; 76 } 77 for(int i = 0;i < m;i++){ 78 int x, y, z; 79 cin >> x >> y >> z; 80 if(mp[x][y] > z) 81 mp[x][y] = z; 82 } 83 84 dijkstra(k); 85 86 int ans = 0; 87 for(int i = 1;i <= n;i++){ 88 ans = max(ans, dis[i]+dis2[i]); 89 //cout << "go: " << dis2[i] << " , ovel : " << dis[i] << endl; 90 } 91 cout << ans << endl; 92 return 0; 93 }