最短路特训:噪音恐惧症(UVA10048) Floyd变形

解题思路:传统Floyd算法的一个变形,floyd的思路是枚举某一点,作为中间点,看新的路径是否小于原来的路径。那么这里我们稍微转换一下,看新的路径的噪声限度( 即max( g[i][k] , g[k][j] ) )是否小于现在的噪声限度,这个新思路可以比较巧妙地解决问题。

题目大意:给定一张无方图,边权是每条路上的噪音大小,求从某点到某点路径中噪音限度(即该路径上边权最大值)最小为多少。

Sample Input 

7 9 3
1 2 50
1 3 60
2 4 120
2 5 90
3 6 50
4 6 80
4 7 70
5 7 40
6 7 140
1 7
2 6
6 2
7 6 3
1 2 50
1 3 60
2 4 120
3 6 50
4 6 80
5 7 40
7 5
1 7
2 4
0 0 0

Sample Output 

Case #1
80
60
60
 
Case #2
40
no path
80
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

int n,m,test,g[101][101];

int main()
{
	while(cin>>n>>m>>test)
	{
		if(n==0&&m==0&&test==0) break;
		memset(g,-1,sizeof(g));
		for(int i=1;i<=m;i++)
		{
			int a,b,c; cin>>a>>b>>c; 
		    g[a][b]=g[b][a]=c;
		}
		for(int k=1;k<=n;k++)
		{
			for(int i=1;i<=n;i++)
			{
				for(int j=1;j<=n;j++)
				{
					if(g[i][k]==-1||g[j][k]==-1) continue;
					if(g[i][j]==-1) g[i][j]=g[j][i]=max(g[i][k],g[j][k]);  //两点还未通路,则直接取该路径噪声最大值。 
					else g[i][j]=g[j][i]=min(g[i][j],max(g[i][k],g[k][j])); //两点已通路,则在新路径噪声限度和现路径噪声限度中取小的一个。 
				}
			}
		}
		for(int i=1;i<=test;i++)
		{
			int a,b; cin>>a>>b;
			if(g[a][b]==-1) cout<<"No path"<<endl;
			else cout<<g[a][b]<<endl;
		}
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值