Poj 1797 Heavy Transportation (最短路變形)
阿新 • • 發佈:2019-02-13
題意:給你一張圖,有n個點,m條邊。讓你求出從1點到n點的所有通路中最小邊的最大值。
題解:最短路的變形。把dijkstra中dis陣列中存的東西改成最小邊的最大值。每次找最大邊來作比較。然後更新dis陣列。
程式碼詳情看註釋:
#include<cstring> #include<cstdio> #include<iostream> #include<cmath> #include<algorithm> #include <iomanip> using namespace std; const int inf = 1e9; const int maxn = 1050; int dis[maxn]; // ×îС±ßµÄ×î´óÖµ int map[maxn][maxn]; // ͼ bool book[maxn]; // ±ê¼ÇÊý×é int n,m; void dijkstra(int start){ int ans ; memset(book,0,sizeof(book)); for(int i = 1; i <= n ; i ++) // ³õʼ»¯ dis[i] = map[1][i]; for(int i = 1; i <= n ; i ++){ ans = 0; int v; for(int j = 1 ; j <= n ; j ++){ if(!book[j] && dis[j] > ans){ // //ÕâÀïÐèҪÿ´ÎÑ¡È¡ÀëÔ´µãȨֵ×î´óµÄ±ßÈ¥ËɳÚ;ʹµÃ×î´óÔØÖØÁ¿¾¡¿ÉÄܵĴó ans = dis[j] ; v = j; } } book[v] = 1; for(int j = 1; j <= n ; j ++){ // Çó×îС±ßµÄ×î´óÖµ dis[j] = max(dis[j],min(dis[v],map[v][j])); } } } int main(){ int z,a,b,c; int t = 1; cin >> z; while(z--){ scanf("%d%d",&n,&m); memset(map,0,sizeof(map)); for(int i = 1 ; i <= m ; i ++){ // ½¨Í¼ scanf("%d%d%d",&a,&b,&c); map[a][b] = map[b][a] = c; } dijkstra(1); printf("Scenario #%d:\n%d\n\n", t++, dis[n]); } return 0; }