Poj 1797 Heavy Transportation (最短路变形)

本文介绍了一种基于Dijkstra算法的变形,用于求解图中从起点到终点路径上的最大边最小值问题。通过修改Dijkstra算法中的距离数组,使其存储路径上遇到的最大边权重,实现了对传统最短路径问题的有效扩展。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:给你一张图,有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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值