题意很简单,找一条路径使得,这条路上最大的噪声量最小,这题是floyd的变种,直接用Floyd算法即可。和之前的题目相同。不过这题最坑爹的是输出格式,在最后不能多输出空行,在这里wrong了良久,后来改动这里的时候过得。代码如下:
/*
ID: csuchenan
PROG: uva10048 Audiophobia
LANG: C++
*/
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std ;
#define INF 1<<29
const int maxn = 115 ;
int map[maxn][maxn] ;
int cross ;
int street ;
int query ;
void floyd() ;
int main()
{
int tests ;
tests = 0 ;
while(scanf("%d %d %d" , &cross , &street , &query)!=EOF)
{
if(!cross)
break ;
int i ;
int j ;
int p ;
int q ;
int w ;
for(i = 0 ; i <= cross ; i ++)
{
for(j = 0 ; j <= cross ; j ++)
map[i][j] = INF ;
map[i][i] = 0 ;
}
for(i = 0 ; i < street ; i ++)
{
scanf("%d %d %d" , &p , &q , &w) ;
map[p][q] = w ;
map[q][p] = w ;
}
floyd() ;
i = 0 ;
if(tests)
printf("\n") ;
printf("Case #%d\n" , ++ tests) ;
while(i < query)
{
scanf("%d %d", &p , &q) ;
if(map[p][q] < INF)
printf("%d\n" , map[p][q]) ;
else
printf("no path\n") ;
i ++ ;
}
}
return 0 ;
}
void floyd()
{
int i ;
int j ;
int k ;
for(k = 1 ; k <= cross ; k ++)
{
for(i = 1 ; i <= cross ; i ++)
{
for(j = 1 ; j <= cross ; j ++)
{
map[i][j] = min(map[i][j] , max(map[i][k] , map[k][j])) ;
}
}
}
}