您的位置:首页 > 运维架构

UVA 10048 - Audiophobia

2011-11-28 22:26 465 查看
这道题和刚才那道题不同,求的是最大边的最小值。同样用了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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: