1. 程式人生 > >Poj 1797 Heavy Transportation (最短路變形)

Poj 1797 Heavy Transportation (最短路變形)

題意:給你一張圖,有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;
}