导航

POJ 1125 Floyd

Posted on 2015-09-19 20:08  tun~  阅读(144)  评论(0编辑  收藏  举报

题意:

有n个传递消息者,每个都有nn个亲信,他们可以把消息传递给他们的亲信,所 花时间为b。

问把最初的消息传递给谁可以在最短的时间内把消息传递给所有人。

思路:

Floyd算出任意两点之间的最短路,然后取每行最大值最小的矩阵作为首先传递出消息的人,将最大值作为把消息传递给所有人最短的时间。

#include<stdio.h>
#include<string.h>
const int inf=99999999;
int pho[105][105];
int main()
{
    int n,nn;
    int a,b;
    scanf("%d",&n);
    while(n>0)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                pho[i][j]=inf;
            }
            pho[i][i]=0;
        }
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&nn);
            for(int j=1;j<=nn;j++)
            {
                scanf("%d%d",&a,&b);
                pho[i][a]=b;
            }
        }
        for(int k=1;k<=n;k++)
        {
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    if(pho[i][j]>pho[i][k]+pho[k][j])
                    {
                        pho[i][j]=pho[i][k]+pho[k][j];
                    }
                }
            }
        }
        int ans=inf;
        int minans=inf;
        for(int i=1;i<=n;i++)
        {
            int mmm=-1;
            for(int j=1;j<=n;j++)
            {
                if(mmm<pho[i][j])
                {
                    mmm=pho[i][j];
                }
            }
            if(minans>mmm)
            {
                minans=mmm;
                ans=i;
            }
        }
        printf("%d %d\n",ans,minans);
        scanf("%d",&n);
    }
}