kuangbin專題專題四 Heavy Transportation POJ - 1797
阿新 • • 發佈:2019-07-17
題目連結:https://vjudge.net/problem/POJ-1797
思路:請參考我列出的另一個題目,和這個題目要求的值相反,另一個清楚後,這個寫的解釋就明白了。
另一個類似題目的部落格:https://www.cnblogs.com/SSummerZzz/p/11200821.html
其實,我們要求的就是從起始點開始到結束點的所有路線中每條路線都選出個子最短的兩點通路距離,然後從這些最短通路中選出最長的那條,即最大的最小距離。
那就是way[ x ] 裡面存的變成了從起始點到這個點的所有路線的最大的最短通路距離,然後讓這個值儘可能的大,即最大化最小距離。
(程式碼不寫註釋了,懂了程式碼就很好理解,注意一下init()函式中,初始化距離變成了0,不清楚的話可以自己思考)
1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 #include <cstdio> 5 #include <string> 6 #include <cmath> 7 #include <iomanip> 8 using namespace std; 9 10 typedef long long LL; 11 #define inf (1LL << 30) - 1 12 #define rep(i,j,k) for(int i = (j); i <= (k); i++) 13 #define rep__(i,j,k) for(int i = (j); i < (k); i++) 14 #define per(i,j,k) for(int i = (j); i >= (k); i--) 15 #define per__(i,j,k) for(int i = (j); i > (k); i--) 16 17 const int N = 1010; 18 int mp[N][N]; 19 bool vis[N]; 20 int w[N]; 21 int n,m; 22 23 void init(){ 24 25 rep(i,1,n) vis[i] = false; 26 rep(i,1,n) rep(j,1,n) { 27 mp[i][j] = 0; 28 } 29 } 30 31 void input(){ 32 33 int u,v,W; 34 rep(i,1,m){ 35 cin >> u >> v >> W; 36 if(mp[u][v] < W) mp[u][v] = mp[v][u] = W; 37 } 38 } 39 40 void dijkstra(){ 41 42 rep(i,1,n) w[i] = mp[1][i]; 43 vis[1] = true; 44 45 rep(i,2,n){ 46 47 int x = -1; 48 int W = -1; 49 50 rep(j,1,n){ 51 if(!vis[j] && W < w[j]) W = w[x = j]; 52 } 53 54 if(x == -1) continue; 55 56 vis[x] = true; 57 rep(k,1,n){ 58 if(!vis[k] && w[k] < min(w[x], mp[x][k])){ 59 w[k] = min(w[x], mp[x][k]); 60 } 61 } 62 } 63 } 64 65 int main(){ 66 67 68 ios::sync_with_stdio(false); 69 cin.tie(0); 70 71 int T; 72 cin >> T; 73 rep(i,1,T){ 74 75 cin >> n >> m; 76 77 init(); 78 input(); 79 dijkstra(); 80 81 cout << "Scenario #" << i << ":" << endl; 82 cout << w[n] << endl << endl; 83 } 84 85 getchar();getchar(); 86 87 return 0; 88 }
&n