POJ1125 Stockbroker Grapevine 多源最短路 Floyd

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

题目大意

有n个人,每个人有t个关系,表示可以把消息用多长时间传递给谁。求用谁传消息最快,最快多少时间。

解题思路

多源最短路,看下谁最快就行了。Floyd算法。

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int INF = 1000000000;
const int maxn = 110;
int eg[maxn][maxn];
int n;
int main()
{
    while(scanf("%d",&n) && n) {
        //init
        for(int i = 0 ; i < maxn ; i ++) {
            for(int j = 0 ; j < maxn ; j ++) eg[i][j] = INF;
        }
        for(int i = 1 ; i <= n ; i ++) {
            int t;
            scanf("%d",&t);
            while(t--) {
                int a,b;
                scanf("%d%d",&a,&b);
                eg[i][a] = b;
            }
        }
        for(int k = 1 ; k <= n ; k ++) {
            for(int i = 1 ; i <= n ; i ++) {
                for(int j = 1 ; j <= n ; j ++) {
                    eg[i][j] = min(eg[i][j],eg[i][k]+eg[k][j]);
                }
            }
        }
        int mi = INF;
        int node;
        bool noone = true;
        for(int i = 1 ; i <= n ; i ++) {
            int ma = -1;
            for(int j = 1 ; j <= n ; j ++) {
                if(j == i) continue;
                if(ma < eg[i][j]) ma = eg[i][j];
            }
            if(ma < mi) {mi = ma;node = i;}
            if(ma != INF) noone = false;
        }
        if(noone) printf("disjoint\n");
        else printf("%d %d\n",node,mi);
    }
    return 0;
}
时间: 2024-10-06 01:10:08

POJ1125 Stockbroker Grapevine 多源最短路 Floyd的相关文章

POJ1125 Stockbroker Grapevine 多源最短路

题目大意 给定一个图,问从某一个顶点出发,到其他顶点的最短路的最大距离最短的情况下,是从哪个顶点出发?需要多久? (如果有人一直没有联络,输出disjoint) 解题思路 Floyd不解释 代码 #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std; const int INF = 1000000000; const

poj1125 Stockbroker Grapevine 最短路 dijkstral + 优先队列

// poj1125 Stockbroker Grapevine 最短路 dijkstral + 优先队列 // // 一个模板吧,留着纪念 #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <queue> using namespace std; typedef pair<int,int> P; const i

POJ1125 Stockbroker Grapevine【Floyd】

Stockbroker Grapevine Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 27977 Accepted: 15527 Description Stockbrokers are known to overreact to rumours. You have been contracted to develop a method of spreading disinformation amongst the st

POJ1125 Stockbroker Grapevine 【Floyd】

Stockbroker Grapevine Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 27431   Accepted: 15201 Description Stockbrokers are known to overreact to rumours. You have been contracted to develop a method of spreading disinformation amongst th

POJ1125——Stockbroker Grapevine

Stockbroker Grapevine Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 27547   Accepted: 15264 Description Stockbrokers are known to overreact to rumours. You have been contracted to develop a method of spreading disinformation amongst th

最短路算法模板合集(Dijkstar,Dijkstar(优先队列优化), 多源最短路Floyd)

再开始前我们先普及一下简单的图论知识 图的保存: 1.邻接矩阵. G[maxn][maxn]; 2.邻接表 邻接表我们有两种方式 (1)vector< Node > G[maxn]; 这个是之前就定义了图的大小了,再下面使用的时候就不用对图的大小进行申请了, 但是因为是直接申请了大小 要对图进行初始化,因此可能在某些题目中这样使用的话会超时 (2)vector< vector<Node> > G; 这个是未定义大小,但是在使用之前要对其的大小内存进行申请. G.resi

POJ1125 Stockbroker Grapevine

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

多源最短路Floyd 算法————matlab实现

弗洛伊德(Floyd)算法是一种用于寻找给定的加权图中顶点间最短路径的算法.该算法名称以创始人之一.1978年图灵奖获得者.斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名. 基本思想 通过Floyd计算图G=(V,E)中各个顶点的最短路径时,需要引入一个矩阵S,矩阵S中的元素a[i][j]表示顶点i(第i个顶点)到顶点j(第j个顶点)的距离. 假设图G中顶点个数为N,则需要对矩阵S进行N次更新.初始时,矩阵S中顶点a[i][j]的距离为顶点i到顶点j的权值:如果i和j不相邻,则a[i][j]=∞

hihocoder1081(Floyd全源最短路)

题目连接:点击打开链接 解题思路: 全源最短路Floyd算法,初始化时对角线为0,其余位置为无穷远. 完整代码: #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; int n , m; const int maxn = 1111; int g[maxn][maxn]; const int INF = 10000000