题意:城市中有C个路口,S条路,每条路有一定的噪声。给出Q个询问,每个询问关于某两个路口,对每个询问需要回答从一个路口走到另一个路口听到最大噪声的最小值。
思路:DP,修改Floyd算法。。设map[i][j]为i到j的最大噪声的最小值,从i到j经过k,则有map[i][j]=max(map[i][k],map[k][j])。
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <memory.h>
#include <vector>
#include <queue>
#include <stack>
#include <ctype.h>
using namespace std;
int map[110][110];
int main(){
int c,s,q;
int count=0;
while(cin>>c>>s>>q){
if(!(c||s||q))break;
count++;
if(count!=1)cout<<endl;
for(int i=0;i<110;i++){
for(int j=0;j<110;j++){
map[i][j]=999999;
}
}
for(int i=0;i<s;i++){
int u,v,w;
cin>>u>>v>>w;
map[u][v]=map[v][u]=w;
}
for(int k=1;k<=c;k++){
for(int i=1;i<=c;i++){
for(int j=1;j<=c;j++){
if(map[i][k]==999999||map[k][j]==999999)continue;
if( max(map[i][k],map[k][j]) < map[i][j] ){
map[i][j]=map[j][i]=max(map[i][k],map[k][j]);
}
}
}
}
printf("Case #%d\n",count);
for(int i=0;i<q;i++){
int u,v;
cin>>u>>v;
if(map[u][v]==999999){
cout<<"no path"<<endl;
}else{
cout<<map[u][v]<<endl;
}
}
}
return 0;
}