UVA10048 - Audiophobia
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=989
题意:给定N个点M条边,给定q个询问,询问x-y的路径上使得经过的每条边的最大值最小的值。
题解:任意节点的询问用Floyd,求最大值最小将转移方程改为d[i][j]=min(d[i][j],max(d[i][k],d[k][j])即可。
AC代码:
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
const int maxn = 105;
const int inf = 0x3f3f3f;
#define _for(i,a,b) for(int i=a;i<=b;i++)
int t,n,a[maxn][maxn],m,q;
int main(int argc, char const *argv[])
{
//freopen("now.in","r",stdin);
while(cin>>n>>m>>q)
{
if(!n&&!m&&!q)break;
if(t!=0)cout<<endl;
_for(i,1,n)
{
_for(j,1,n)
if(i==j)a[i][j]=0;
else a[i][j]=inf;
}
_for(i,1,m)
{
int x,y,z;
cin>>x>>y>>z;
a[x][y]=z;
a[y][x]=z;
}
_for(k,1,n)
{
_for(i,1,n)
{
_for(j,1,n)a[i][j]=min(a[i][j],max(a[i][k],a[k][j]));
}
}
cout<<"Case #"<<++t<<endl;
_for(i,1,q)
{
int x,y;
cin>>x>>y;
if(a[x][y]==inf)cout<<"no path"<<endl;
else cout<<a[x][y]<<endl;
}
}
return 0;
}