POJ 1125 Stockbroker Grapevine

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

给出了这个概念,叫做偏心度,就是一个点到途中任一点的距离要最小,先用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);

    }

}

 

 

你可能感兴趣的:(broker)