POJ 1125 Stockbroker Grapevine(弗洛伊德算法实现)

版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37618760/article/details/82108901

Stockbroker Grapevine

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 39440   Accepted: 22011

Description

Stockbrokers are known to overreact to rumours. You have been contracted to develop a method of spreading disinformation amongst the stockbrokers to give your employer the tactical edge in the stock market. For maximum effect, you have to spread the rumours in the fastest possible way. 

Unfortunately for you, stockbrokers only trust information coming from their "Trusted sources" This means you have to take into account the structure of their contacts when starting a rumour. It takes a certain amount of time for a specific stockbroker to pass the rumour on to each of his colleagues. Your task will be to write a program that tells you which stockbroker to choose as your starting point for the rumour, as well as the time it will take for the rumour to spread throughout the stockbroker community. This duration is measured as the time needed for the last person to receive the information.

Input

Your program will input data for different sets of stockbrokers. Each set starts with a line with the number of stockbrokers. Following this is a line for each stockbroker which contains the number of people who they have contact with, who these people are, and the time taken for them to pass the message to each person. The format of each stockbroker line is as follows: The line starts with the number of contacts (n), followed by n pairs of integers, one pair for each contact. Each pair lists first a number referring to the contact (e.g. a '1' means person number one in the set), followed by the time in minutes taken to pass a message to that person. There are no special punctuation symbols or spacing rules. 

Each person is numbered 1 through to the number of stockbrokers. The time taken to pass the message on will be between 1 and 10 minutes (inclusive), and the number of contacts will range between 0 and one less than the number of stockbrokers. The number of stockbrokers will range from 1 to 100. The input is terminated by a set of stockbrokers containing 0 (zero) people. 
 

Output

For each set of data, your program must output a single line containing the person who results in the fastest message transmission, and how long before the last person will receive any given message after you give it to this person, measured in integer minutes. 
It is possible that your program will receive a network of connections that excludes some persons, i.e. some people may be unreachable. If your program detects such a broken network, simply output the message "disjoint". Note that the time taken to pass the message from person A to person B is not necessarily the same as the time taken to pass it from B to A, if such transmission is possible at all.

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

Source

Southern African 2001

题目翻译:

你的任务是编写一个程序,告诉你选择哪个股票经纪人作为谣言的起点,以及谣言传播到股票经纪人社区所需的时间。该持续时间测量为最后一个人接收信息所需的时间。
您的程序将输入不同的股票经纪人数据。每组都以一条包含股票经纪人数量的行开头。接下来是每个股票经纪人的一行,其中包含他们与之联系的人数,这些人是谁,以及他们将消息传递给每个人所花费的时间。每个股票经纪人行的格式如下:该行以联系人数量(n)开头,后跟n对整数,每个联系人一对。每一对首先列出一个指代联系人的号码(例如,“1”表示该组中的第一个人),然后是将消息传递给该人所花费的时间(以分钟为单位)。没有特殊的标点符号或间距规则。

每个人的编号为1到股票经纪人的数量。传递消息所花费的时间将介于1到10分钟(包括1和10分钟)之间,并且联系人数量将介于0到1之间,而不是股票经纪人数量。股票经纪人的数量范围从1到100.输入由一组包含0(零)人的股票经纪人终止。

思考:求每一对顶点之间的最短路径问题,是典型的弗洛伊德算法。

             我们选择其中一组数据画图就能解决问题。

           

            我们可以看到,最小的话费时间是3号到2号的6分钟

           源代码如下:

         

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=20;
int n,t;
int dist[101][101];
void floyd(){
    //以下五行代码是典型的Floyd算法
    for(int k=1;k<=t;k++){
        for(int i=1;i<=t;i++){
            for(int j=1;j<=t;j++){
                if(i!=j&&dist[i][j]>dist[i][k]+dist[k][j])
                    dist[i][j]=dist[i][k]+dist[k][j];
            }
        }
    }
    int maxlen;
    int min_in_max=maxn;
    int flag_source;

    for(int i=1;i<=t;i++){
        maxlen=0;
        for(int j=1;j<=t;j++)
            if(i!=j&&maxlen<dist[i][j])
                maxlen=dist[i][j];//找到最长路径
        if(min_in_max>maxlen){
            min_in_max=maxlen;//最长路径中的最短路
            flag_source=i;//记录源点
        }
    }
    if(min_in_max<maxn)
        cout<<flag_source<<" "<<min_in_max<<endl;
    else
        cout<<"disjoint"<<endl;
    return ;
}
int main()
{
    while(1)
    {
        memset(dist,maxn,sizeof(dist));
        cin>>t;//输入经纪人的数量
        if(!t) break;
        for(int i=1; i<=t; i++)
        {
            cin>>n;
            for(int j=1; j<=n; j++)
            {
            int par,time;//设置下一个人的id,传递谣言的时间
            cin>>par>>time;
            dist[i][par]=time;
            }
        }
        floyd();
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_37618760/article/details/82108901
今日推荐