您的位置:首页 > 其它

Poj 1797 Heavy Transportation (最短路变形)

2018-01-24 15:25 330 查看
题意:给你一张图,有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
);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: