POJ 1125 Stockbroker Grapevine(Floyd)

题意:你是一个股票经纪人,现在要你去散布一些谣言来为你的雇主服务。你需要找到最快的一个方法将谣言传到所有人那里,但是谣言只能从一些人传到另一些特定的人而不能随意传递。现在,让你求出最少将谣言传遍所需要的时间和起始点的坐标。

思路:直接Floyd求出所有点之间的最短路,然后枚举第一个到第n个点,每次枚举找出以该点位起点位置到其余点的最长边。然后从n个最长边里面找出一个值最小的即可,即为所需的最短传播时间。

#include<stdio.h>
#define maxn 99999999
int dist[1000][1000];
int main()
{
    int m,n,q,i,j,k,ans,count,max;
    while(scanf("%d",&n)&&n!=0)
    {
        ans=-maxn,count=1;//ans是最后输出的最短边,count表示起点是count
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                dist[i][j]=maxn;
        for(i=1;i<=n;i++)
            dist[i][i]=0;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&m);
            for(j=1;j<=m;j++)
            {
                scanf("%d",&q);
                scanf("%d",&dist[i][q]);
            }
        }//建图与预处理完毕
        for(i=1;i<=n;i++)//直接Floyd算法
            for(j=1;j<=n;j++)
                for(k=1;k<=n;k++)
                    if(dist[j][k]>dist[j][i]+dist[i][k])
                        dist[j][k]=dist[j][i]+dist[i][k];

        for(i=2;i<=n;i++)
            if(ans<dist[1][i])
                ans=dist[1][i];

        for(i=2;i<=n;i++)
        {
            max=-maxn;//max表示从第i个点到其他点最长的一条边
            for(j=1;j<=n;j++)
                if(max<dist[i][j])
                    max=dist[i][j];
            if(ans>max)
            {
                ans=max;
                count=i;
            }
        }
        printf("%d %d\n",count,ans);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值