pku1125: Stockbroker Grapevine

pku1125: http://poj.org/problem?id=1125
题意:群发短信:给出n个群发者,输出的第i行的第一个输出k表示第i个发信息者可以给k个人发短信,接着输出k对数据,每对两个数分别表示被联系者的编号和与其联系时间,问由哪个人群发短信花费的时间最短,转化为最短路问题即为:给出每个点到其他点的距离,求所有点到其他点最长距离的最小值,并输出该起点 解法:floyd求出每个点到各点的最短路,再枚举各点,求出各个最大值,再取最小值 code:
#include<iostream>
#include<cstdio>
#include<cstdlib>
int v[150][150];
const int inf=1<<29;
int main()
{
    int n,k,a,b,max,min,ans;
    while(1)
    {
        scanf("%d",&n);
        if(n==0)break;
        for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
        {
            if(i==j)
                v[i][j]=0;
            else
                v[i][j]=inf;
        }
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&k);
            while(k--)
            {
                scanf("%d%d",&a,&b);
                v[i][a]=b;
            }
        }
        for(int t=1;t<=n;t++)   //floyd
        {
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    if(v[i][j]>v[i][t]+v[t][j])
                        v[i][j]=v[i][t]+v[t][j];
                }
            }
        }
        min=inf;ans=-1;
        for(int i=1;i<=n;i++)
        {
            max=-1;
            for(int j=1;j<=n;j++)
            {
                if(v[i][j]>max)
                {
                    max=v[i][j];
                }
            }
            if(max<min)
            {
                min=max;ans=i;
            }
        }
        if(ans==-1)
            printf("disjoint\n");
        else
            printf("%d %d\n",ans,min);
    }
}
/*input:
3
2 2 4 3 5
2 1 2 3 6
2 1 2 2 2
5
3 4 4 2 8 5 3
1 5 8
4 1 6 4 10 2 7 5 2
0
2 2 5 1 5
0
output:
3 2
3 10*/

posted on 2012-07-25 22:02  acmer-jun  阅读(179)  评论(0编辑  收藏  举报

导航