POJ1125——Floyd简单应用

比较基础的一道题:

众所周知,证券经纪人对于市场传闻十分敏感。现在你被雇佣去开发一种在经纪人之间传播虚假信息的模式,使得你的雇主在市场中获得特殊的战略优势。为了获得最大的效果,你必须在尽可能快的时间内传播谣言。

不幸的是,证券经纪人只信赖来自他们认为是“可靠来源”的消息。这意味着你必须在开始传播流言时考虑他们之间的关系。当流言开始传播时,某个经纪人需要一定的时间将其传递给他的所有同事。

你的任务是编写一个程序,输出需要选择哪个证券经纪人作为流言传播的起点,以及这个流言传播完整个经纪人社群所需的时间。所需的时间指的是最后一个经纪人接受到消息所花费的时间。

Input你的程序将输入多个不同股票经纪人群体的数据。每一组的第一行是股票经纪人的人数。接下来一行包括每个经纪人可以联系的人的数量,这些人是谁,和他传递信息给每一个人所花的时间。每一行格式如下:最开始是可以联系的人的数目  n,然后是  n对整数,一对整数代表了他与一个联系人的情况。每一对整数列出的第1个数字是联系人编号(例如:"1"是指社群中的1号联系人),第2个数字是指把消息传给那个联系人需要花几分钟。没有其他的标点符号或空格。 

每个人的编号为i(1 ≤ i ≤ nn为一个社群中股票经纪人的总数量),传递信息的时间为t分钟(1 ≤ t ≤ 10),可以与之联系的人的数量为x (0 ≤ x ≤ n-1),股票经纪人的数量为n(1 ≤ n ≤ 100) 。输入的终止条件是股票经纪人社群含有0个人。  

Output对于每一组数据,你的程序必须输出一行整数,包含能使消息传递得最快的那个联系人,以及给定的消息从这个人传递到最后一个人所花费的时间,以整数分钟来度量。 

你的程序可能会收到某种排除了一些人在外的联系网络,如有些人可能无法被任何人联系到。如果你的程序检测到这种不连通的网络,只需输出“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得出总数组后,还要判断是否存在两点不可达(我写的代码没有去判断,但似乎测试数据也没有这样的数据,直接ac了),其次,求联系人和时间时,先得出每个联系人所花费的必要最短时间(即以该联系人为源点到其他点的最长距离),然后再求出花费最少时间的联系人。

代码:

//
//  main.cpp
//  Dijkstra_POJ1125
//
//  Created by jinyu on 2018/7/12.
//  Copyright © 2018年 jinyu. All rights reserved.
//

#include <iostream>
#include <algorithm>
#include <fstream>
using namespace std;
const int INF = 0x3f3f3f3f;
int v[100+10];
int arc[100+10][100+10];
int path[100+10][100+10];
int main(){
    
    
    
    int N ;
    cin>>N;
    while(N!=0){
        int num = N;
        for(int i = 1;i<=N;i++){
            v[i] = i;
            for(int j = 1;j<=N;j++){
                if(i==j)
                {
                    arc[i][j] = 0;
                    path[i][j] = 0;
                }
                else{
                    arc[i][j] = INF;
                    path[i][j] = INF;
                }
            }
        }
        while(num--){
            v[N-num] = N-num;
            int nCan;
            cin>>nCan;
            int nn = nCan;
            while(nn--){
                int who;
                int time;
                cin>>who>>time;
                arc[N-num][who] = time;
                path[N-num][who] = time;
            }
        }
        for(int k = 1;k<=N;k++){
            for(int i = 1;i<=N;i++){
                for(int j = 1;j<=N;j++){
                    if(path[i][j]>path[i][k]+path[k][j])
                        path[i][j] = path[i][k]+path[k][j];
                }
            }
        }
        int whoFirst = -1;
        int totalTime = INF;
        for(int i = 1;i<=N;i++){
            int temp = 0;
            for(int j = 1;j<=N;j++){
                if(temp<path[i][j]){
                    temp = path[i][j];
                }
            }
            if(totalTime>temp){
                totalTime = temp;
                whoFirst = i;
            }
        }
        cout<<whoFirst<<" "<<totalTime<<endl;
        cin>>N;
    }
}
ps:一开始数组开在main函数内,并且直接用了变量N,自己电脑上可以正确运行,但提交到oj时会报数组错误。可能和xcode编译有关。还是应该注意正确书写。

猜你喜欢

转载自blog.csdn.net/qq_41508508/article/details/81020317
今日推荐