解题思路:传统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;
}