首页 > 代码库 > POJ 1125 Stockbroker Grapevine

POJ 1125 Stockbroker Grapevine

题意:给你n个股票经纪人,要你再找出联系所有人的最短时间,有则输出,无则输出一个字符串。

接下来是n组数据,每组数据开头表示第i个经纪人有m个联系人,接下来是m对数据  第一个表示 第几个联系人  第二个数则是联系到他所需要的时间

思路:这个题目主要的是理解题目的意思,理解之后就非常简单了,只要先求出每2个点的最短距离,然后再求出以第i个点为顶点到达第j个点所需要的最长距离,即可把所有的人联系一遍。因为我们求出每2个点的最短距离,所以可以用floyd算法了,这个算法是最容易理解的!

所以AC代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define inf 100
int d[120][120];
int main()
{
    int i,j,n,k;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0)break;
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
            {
                d[i][j]=inf;
            }
        for(i=1;i<=n;i++)
        {
            int u;
            scanf("%d",&u);
            for(j=1;j<=u;j++)
            {
                int v,w;
                scanf("%d %d",&v,&w);
                d[i][v]=w;
            }
        }
        for(i=1;i<=n;i++)       //求出每2个点的最短距离
            for(j=1;j<=n;j++)
                for(k=1;k<=n;k++)
                {
                    if(j!=k&&d[j][k]>d[j][i]+d[i][k])
                        d[j][k]=d[j][i]+d[i][k];
                }
        int temp,maxx,minn=inf;
        for(i=1;i<=n;i++)//每次以i为图的顶点
        {
            maxx=0;
            for(j=1;j<=n;j++)   //找出以i为顶点的最大距离点
                if(i!=j&&maxx<d[i][j])
                    maxx=d[i][j];
            if(maxx<minn)       //替换
            {
                minn=maxx;
                temp=i;
            }
        }
        if(minn<inf)
            printf("%d %d\n",temp,minn);
        else
            printf("disjoint\n");
    }
    return 0;
}