题目链接:https://vjudge.net/problem/POJ-3268
题意:点X处开办排队,其他点的牛到X点去参加派对,然后从X点回到各自的点,通路是单向的,所有牛都要走最短路,
求出所有牛走的最短路中最长的那条路。
(直接看代码吧,就是一处改一下,别的和dijkstra板子差不多)
1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 #include <cstdio> 5 #include <string> 6 using namespace std; 7 8 typedef long long LL; 9 #define inf (1LL << 30) - 1 10 #define rep(i,j,k) for(int i = (j); i <= (k); i++) 11 #define rep__(i,j,k) for(int i = (j); i < (k); i++) 12 #define per(i,j,k) for(int i = (j); i >= (k); i--) 13 #define per__(i,j,k) for(int i = (j); i > (k); i--) 14 15 const int N = 1010; 16 int G[N][N]; 17 bool vis[N]; 18 int dis1[N]; 19 int dis2[N]; 20 int u,v,w; 21 int n,m,X; 22 23 void init(){ 24 25 rep(i,1,n) vis[i] = false; 26 rep(i,1,n) rep(j,1,n){ 27 if(i == j) G[i][j] = 0; 28 else G[i][j] = inf; 29 } 30 } 31 32 void input(){ 33 34 rep(i,1,m){ 35 cin >> u >> v >> w; 36 if(G[u][v] > w) G[u][v] = w; 37 } 38 } 39 40 void dijkstra(){ 41 42 ////////////////////////////////////////////////////////// 43 //(1)第一部分 44 rep(i,1,n) dis1[i] = G[i][X]; //dis[]存的是其他城市到X点的最短距离 45 vis[X] = true; 46 47 rep(i,2,n){ 48 49 int x = -1; 50 int w = inf; 51 52 rep(j,1,n){ 53 if(!vis[j] && w > dis1[j]) w = dis1[x = j]; 54 } 55 if(x == -1) continue; 56 57 vis[x] = true; 58 rep(k,1,n){ 59 //如果k点到X点的距离 大于 k点到x点的距离加上x到X点的距离 那么更新dis[]数组 60 if(!vis[k] && dis1[k] > dis1[x] + G[k][x]){ 61 dis1[k] = dis1[x] + G[k][x]; 62 } 63 } 64 } 65 66 // rep(i,1,n) cout << dis1[i] << endl; 67 68 //////////////////////////////////////////////////////////// 69 //(2)第二部分 就是一模一样的dijkstra板子 70 rep(i,1,n) vis[i] = false; 71 rep(i,1,n) dis2[i] = G[X][i]; 72 vis[X] = true; 73 74 rep(i,2,n){ 75 int x = -1; 76 int w = inf; 77 78 rep(j,1,n){ 79 if(!vis[j] && w > dis2[j]) w = dis2[x = j]; 80 } 81 82 if(x == -1) continue; 83 84 vis[x] = true; 85 rep(k,1,n){ 86 if(!vis[k] && dis2[k] > dis2[x] + G[x][k]){ 87 dis2[k] = dis2[x] + G[x][k]; 88 } 89 } 90 } 91 int ans = 0; 92 93 //把来回的路线加起来,选出最长的那个来回,就是答案 94 rep(i,1,n) if(i != X) ans = max(ans, dis1[i]+ dis2[i]); 95 96 cout << ans << endl; 97 } 98 99 int main(){ 100 101 ios::sync_with_stdio(false); 102 cin.tie(0); 103 104 cin >> n >> m >> X; 105 106 init(); 107 input(); 108 dijkstra(); 109 110 getchar();getchar(); 111 return 0; 112 }