POJ 1125 Stockbroker Grapevine(Floyd)

Description
有N个股票经济人可以互相传递消息,他们之间存在一些单向的通信路径。现在有一个消息要由某个人开始传递给其他所有人,问应该由哪一个人来传递,才能在最短时间内让所有人都接收到消息。若不存在这样一个人,则输出disjoint
Input
多组输入,每组用例第一行为人数n,对于后面n行第i行,第一个数m为第i个人能够传递信息的人数,后面m对整数a,b,a为传递信息给第a个人,b表示传递信息耗时(1<=i<=n),当n=0时结束输入
Output
对于每组用例,若存在某个人能够在最短时间内让所有人都接收到信息则输出此人编号以及传递信息最短用时,若不存则输出disjoint
Sample 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
Sample Output
Sample Output
3 2
3 10
Solution
多源最短路问题,用floyd算法求出所有存在的路径,然后对每个人判断是否可以由他来传递以及传递的时间,取最小的那个即可
Code

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
#define maxn 101
int f[maxn][maxn];
int restt[maxn],restm[maxn];
int n,m,p=0;
int x,y;

int main()
{
    while(scanf("%d",&n)&&n)
    {
        int i,j,k;
        memset(f,0x3f,sizeof(f));//初始化 
        m=0;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&k);
            f[i][i]=0;//自己传递给自己不耗时 
            for(j=1;j<=k;j++)
            {
                scanf("%d%d",&x,&y);
                f[i][x]=y;
                m=max(m,x);//m为总人数 
            }   
        }
        for(k=1;k<=m;k++)//floyd 
            for(i=1;i<=m;i++)
                for(j=1;j<=m;j++)
                    f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
        int man=1,time=9999;
        for(i=1;i<=m;i++)//对每个人判断其是否满足条件 
        {
            int t=0; 
            for(j=1;j<=m;j++)
                if(i!=j&&t<f[i][j])
                    t=f[i][j];
            if(t<time)//更新最短用时及传递者 
            {
                time=t;
                man=i;
            }
        }
        restm[p]=man; 
        restt[p]=time;
        p++;
    }
    for(int i=0;i<p;i++)
        printf("%d %d\n",restm[i],restt[i]);
    return 0;
}

你可能感兴趣的:(POJ 1125 Stockbroker Grapevine(Floyd))