这道题和刚才那道题不同,求的是最大边的最小值。同样用了floyd算法
d[i][j]=min{d[i][j],max{d[i][k],d[k][j]}}
Initilization: d[1..n][1..n]= -1,d[i][i]=0;
#include<stdio.h>
#define MAXD 105
int u, v, w, C, S, Q, q[10005];
int d[MAXD][MAXD];
int max( int a, int b)
{
return a > b ? a : b;
}
void init()
{
for( int i = 1; i <= C; i ++)
for( int j = 1; j <= C; j ++)
{
if( i == j) d[i][j] = 0;
else d[i][j] = -1;
}
for( int i = 0; i < S; i ++)
{
scanf( "%d%d%d", &u, &v, &w);
d[u][v] = d[v][u] = w;
}
}
void floyd()
{
for( int k = 1; k <= C; k ++)
for( int i = 1; i <= C; i ++)
for( int j = 1; j <= C; j ++)
if( d[i][k] != -1 && d[k][j] != -1)
{
int temp = max( d[i][k], d[k][j]);
if( d[i][j] == -1 || d[i][j] > temp )
d[i][j] = temp;
}
}
int main()
{
int cas = 0;
while( true)
{
scanf( "%d%d%d", &C, &S, &Q);
if( C == 0 && S == 0 && Q == 0) break;
init();
floyd();
if( cas ++) printf( "\n");
printf( "Case #%d\n", cas);
for( int i = 1; i <= Q; i ++)
{
scanf( "%d%d", &u, &v);
q[i] = d[u][v];
}
for( int i = 1; i <= Q; i ++)
{
if( q[i] == -1)
printf( "no path\n");
else
printf( "%d\n", q[i]);
}
}
return 0;
}
http://hi.baidu.com/knowledgetime/blog/item/6c6c71c1b30d703ae5dd3bdb.html
浙公网安备 33010602011771号