POJ 1125 Stockbroker Grapevine(floyd算法)

原文链接

题目大意:

众所周知,股票经纪人对谣言反应过度。你被委托开发一种在股票经纪人之间散布虚假信息的方法,使你的雇主在股票市场上获得战术优势。为了达到最大的效果,你必须以最快的速度传播谣言。

 

对你来说不幸的是,股票经纪人只信任来自他们“可信来源”的信息,这意味着你在开始谣言时必须考虑他们的联系结构。一个股票经纪人要把谣言传到他的每个同事身上需要一定的时间。你的任务将是编写一个程序,告诉你选择哪个股票经纪人作为谣言的起点,以及谣言在整个股票经纪人社区传播的时间。此持续时间是最后一个人接收信息所需的时间。

输入

您的程序将为不同的股票经纪人集输入数据。每个集合都以一行股票经纪人的数量开始。下面是针对每个股票经纪人的一行,其中包含与他们有联系的人数、这些人是谁以及他们将消息传递给每个人所花费的时间。每一行股票经纪人的格式如下:该行以联系人数量(n)开始,然后是n对整数,每个联系人对应一对整数。每一对都首先列出一个与联系人相关的数字(例如,“1”表示该集合中的第一个人),然后是向该联系人传递消息所需的时间(以分钟为单位)。没有特殊的标点符号或空格规则。

 

每个人的编号从1到股票经纪人的数量。传递消息的时间将在1到10分钟之间(含10分钟),联系人的数量将比股票经纪人的数量少0到1人。股票经纪人的人数将从1人到100人不等。输入由一组包含0人的股票经纪人终止。

 

输出

对于每一组数据,您的程序必须输出一行数据,其中包含导致消息传输速度最快的人,以及在您将消息发送给最后一个人之后多久最后一个人将接收到任何给定的消息,以整数分钟为单位。

您的程序可能会接收到一个排除某些人的连接网络,即有些人可能无法联系到。如果您的程序检测到这样一个损坏的网络,只需输出消息“disjoint”。请注意,如果可能的话,将消息从A传递到B所花费的时间不一定与从B传递到A所花费的时间相同。

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

3 2
3 10

 

思路:这算是一个典型的最短路问题,数据范围不算太大,所以可以运行多个最短路的算法,我是用的Floyd算法

       因为最开始选择的出发点不固定,因此需要求所有点之间的最短路,用flody算法来判断图是否连通,可以通过判断是否从图中所有的出发点都存在无法到达的点来实现,如果从图中所有的点出发都无法到达的点,则说明图不连通~~~~~

 

样例解释:例如第一组样例,如果从3开始传播,则1,2得知谣言的时间都是2,所用的时间比1,2开始传播所用的时间短,所以输出的是3 2.

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>

const int INF = 9999999;

using namespace std;

int main()
{
    int n , m , x , y , e[666][666];
    while(~scanf("%d",&n) && n)
    {
        for(int i = 1 ; i <= n ; i ++)
        {
            for(int j = 1 ; j <= n ; j ++)
            {
                e[i][j] = INF;
            }
        }
            for(int i = 1 ; i <= n ; i ++)
            {
                cin >> m;
                while(m --)
                {
                    cin >> x >> y;
                    e[i][x] = y;
                }
            }
        for(int k = 1 ; k <= n ; k ++)
        {
            for(int i = 1 ; i <= n ; i ++)
            {
                for(int j = 1 ; j <= n ; j ++)
                {
                    if(e[i][k] + e[k][j] < e[i][j])
                    {
                        e[i][j] = e[i][k] + e[k][j];
                    }
                }
            }
        }

        int sum , s , ma = 9999;
        for(int i = 1 ; i <= n ; i ++)
        {
            sum = 0 ;
            for(int j = 1 ; j <= n ; j ++)
                if(i != j && e[i][j] > sum)
                    sum = e[i][j];
                if(sum < ma)
                {
                    s
                     = i;
                    ma = sum;
                }
        }
        cout << s << " " << ma << endl;
    }
    return 0 ;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值