IT民工
加油!

求任意两点之间的最短路径最大值的最小值,听起来有点绕口,不过数据结构课程设计里面

给出了这个概念,叫做偏心度,就是一个点到途中任一点的距离要最小,先用floyd求出任

意两点之间的最短路,再枚举每一个点到其他点的最短距离,找出其中最大那个,和其

他的最大值来比较,找出全图的最小值。

/*Accepted    168K    0MS    C++    1217B    2012-07-26 15:42:29*/
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int MAXN = 1 << 7;
int f[MAXN][MAXN], n, m, T, Min;

void ReadGragh()
{
    for( int i = 1; i <= n; i ++)
        for( int j = 1; j <= n; j ++)
        {
            if( i != j)
                f[i][j] = MAXN * 10;
            else
                f[i][j] = 0;
        }

    for( int i = 1; i <= n; i ++)
    {
        int x;
        scanf( "%d", &x);
        while( x --)
        {
            int t;
            scanf( "%d", &t);
            scanf( "%d", &f[i][t]);
        }
    }
}

void floyd()
{
    for( int k = 1; k <= n; k ++)
        for( int i = 1; i <= n; i ++)
            for( int j = 1; j <= n; j ++)
                f[i][j] = min( f[i][j], f[i][k] + f[k][j]);
    Min =  MAXN * 10;
    for( int i = 1; i <= n; i ++)
    {
        int Max = 0;
        for( int j = 1; j <= n; j ++)
            Max = max( f[i][j], Max);
        if( Min > Max) {
            Min = Max;
            T = i;
        }
    }
}

int main()
{
    while( scanf( "%d", &n), n)
    {
        ReadGragh();
        floyd();
        printf( "%d %d\n", T, Min);
    }
}

 

 

posted on 2012-07-26 15:50  找回失去的  阅读(270)  评论(0)    收藏  举报