POJ 1125 Stockbroker Grapevine

来源:互联网 发布:mac版千牛无法登陆 编辑:程序博客网 时间:2024/06/11 17:05
Stockbroker Grapevine
Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 23303 Accepted: 12751

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

32 2 4 3 52 1 2 3 62 1 2 2 253 4 4 2 8 5 31 5 84 1 6 4 10 2 7 5 202 2 5 1 50

Sample Output

3 23 10

Source

Southern African 2001
 
题意:
告诉你几个经理人到其他经理人的传播时间,求将消息传遍所有人的最短时间
 
代码:
#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#include<string>#include<queue>#include<algorithm>#define MAX 102#define INF 0x3f3f3f3fusing namespace std;int dis[MAX];    //dis[i]用存储当前节点front到第i个节点的最短路bool vist[MAX];  //vist[i]用来标记第i个节点是否走过int map[MAX][MAX];int n,i;int dij(int front){memset(dis,0,sizeof(dis));memset(vist,false,sizeof(vist));for(i=1;i<=n;i++)dis[i]=map[front][i];vist[front]=true;int sum=0,num=1;int max=0;for(int j=0;j<n-1;j++){int min=INF,flag=0;for(int k=1;k<=n;k++){if(!vist[k] && min>dis[k]){min=dis[k];flag=k;}}if(min==INF) break;vist[flag]=true;if(min>max){sum+=(min-max);   /*如果min大于前驱节点传播的最大时间,则只需加上min和max的差,修改前驱节点传播最大时间如果min小于前驱结点的传播最大时间,则总传播时间不变*/max=min;}num++;for(int k=1;k<=n;k++)if(!vist[k] && dis[k]>dis[flag]+map[flag][k])dis[k]=dis[flag]+map[flag][k];}if(num!=n) return INF;else return sum;}int main(){int min,min_front;while(scanf("%d",&n)!=EOF && n){memset(map,INF,sizeof(map));int v,w;for(i=1;i<=n;i++){int k;scanf("%d",&k);while(k--){scanf("%d%d",&v,&w);map[i][v]=w;}map[i][i]=0;}min=INF; min_front=0;for(int j=1;j<=n;j++){int k;k=dij(j);if(min>k){min=k;min_front=j;}}if(min_front==0) printf("disjoint\n");else printf("%d %d\n",min_front,min);}return 0;}

思路:
单元最短路问题 用Dijkstra解决
由于源头节点和最终节点未定,故需从始至终遍历一遍,找出最短时间
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 护士资格证从诊所变更到医院怎么办 杭州驾考预约面授没有去怎么办 在外地考的驾驶证丢了怎么办 身份证和驾驶证在外地丢了怎么办 我有摩e照学c1照怎么办 科三网上预约超过了次数限制怎么办 驾照罚款没交过了周期怎么办 驾照考了科科目一想换个驾校怎么办 韩国货物被机场海关扣了怎么办 车管所查不到居住证信息怎么办 高中毕业两年了想考大学怎么办 我买的二手货车营运证是假的怎么办 移民到欧洲国家想去日本怎么办签证 签证要写工作单位如果没有怎么办 办护照时的身份证过期了怎么办 有摩托车驾照想考小车驾照怎么办 分管副局长能直接安排工作吗怎么办 我在北京打工老婆没地方住怎么办 我的车扣了32分怎么办 济南万科地产投诉电话不管用怎么办 买手机被商家欺骗买到合约机怎么办 向消协投诉有用吗?我该怎么办? 我住南开区想办公租房不知怎么办 租房提前退房房东不退押金怎么办 体检时候眼睛有一只是弱视怎么办? b本被扣分9分了怎么办 工作调动后在新单位退休医保怎么办 社保卡和医保卡丢了怎么办 医保卡挂失后又找到了怎么办 医保卡丢失忘了卡号怎么办? 医保卡丢了怎么办又记不住卡号 住院发票丢了医保不给报销怎么办 住院期间被医院丢失了医保卡怎么办 大学时的医保卡毕业后丢了怎么办 用身份证注册的移动卡丢了怎么办 用别人身份证办的卡丢了怎么办 济南医保卡挂失后又找到了怎么办 单位没有给办理医保卡的老人怎么办 单位办的医保卡丢了怎么办 北京退休人员医保卡丢了怎么办 普通发票联丢了医保给报销怎么办