Audiophobia

UVa 10048


这道题只需要在Floyd算法稍微改一下就行了,求出间接能到达一点的最大值,和

本身求出最小值就行了。

#include 
#define INF 100000005
const int maxn = 105;
int map[maxn][maxn], n, m;
void init ( )
{
    for ( int i = 0; i <= n; i ++ ) //初始化,只有起点终点一样时为0
        for ( int j = 0; j <= n; j ++ )
            map[i][j] = i == j ? 0 : INF;
}
inline int Max ( int a, int b )
{
    return a > b ? a : b;
}
inline int Min ( int a, int b )
{
    return a < b ? a : b;
}
void floyd ( )
{
    for ( int k = 1; k <= n; k ++ )
        for ( int i = 1; i <= n; i ++ )
            for ( int j = 1; j <= n; j ++ )
                map[i][j] = Min ( map[i][j], Max ( map[i][k], map[k][j] ) );
    //求间接路径的最大值 在求最小值
}
int main ( )
{
    int q, cas = 0, u, v, l;
    while ( ~ scanf ( "%d%d%d", &n, &m, &q ) && ( n || m || q ) )
    {
        init ( );
        while ( m -- )
        {
            scanf ( "%d%d%d", &u, &v, &l );
            if ( map[u][v] > l )    //有可能存在同一段都有值
                map[u][v] = map[v][u] = l;
        }
        if ( cas ++ )
            printf ( "\n" );
        printf ( "Case #%d\n", cas );
        floyd ( );
        while ( q -- )
        {
            scanf ( "%d%d", &u, &v );
            if ( map[u][v] >= INF ) //超过最大值证明没有最短路
                printf ( "no path\n" );
            else
                printf ( "%d\n", map[u][v] );
        }
    }
    return 0;
}


你可能感兴趣的:(紫书,最短路径)