一、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.

二、题解

        该题的英文比题目更难懂啊,幸好BBS上有大神的翻译和解释,下面就是引用:

        首先,题目可能有多组测试数据,每个测试数据的第一行为经纪人数量N(当N=0时,输入数据结束),然后接下来N行描述第i(1<=i<=N)个经纪人与其他经纪人的关系 。每行开头数字M为该行对应的经纪人有多少个经纪人朋友(该节点的出度,可以为0),然后紧接着M对整数,每对整数表示成a,b,则表明该经纪人向第a个经纪人传递信息需要b单位时间(即第i号结点到第a号结点的孤长为b),整张图为有向图,即弧Vij 可能不等于弧Vji。当构图完毕后,求当从该图中某点出发,将“消息”传播到整个经纪人网络的最小时间,输出这个经纪人号和最小时间。最小时间的判定方式为——从这个经纪人(结点)出发,整个经纪人网络中最后一个人接到消息的时间。如果有一个或一个以上经纪人无论如何无法收到消息,输出“disjoint”(有关图的连通性,你们懂得,但据其他同学说,POJ测试数据中不会有,就是说,你不判定,一样能过,题目数据够水的)。

       解决这个问题的方法有本文所用的Floyd-Warshall算法,也可以用迪杰斯特拉最短路径算法。Floyd-Warshall算法详见算法,我已经在前篇文章中简单介绍了一下。

三、Java代码

import java.util.Scanner;

public class Main {
static int[][] map;
static int[][][] dist;
static int n;
static int INF=Integer.MAX_VALUE;
public static void floyd(){
int i,j,k;
for(k=1;k<=n;k++){
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
if (i!=j && map[i][k]!=INF && map[k][j]!=INF && map[i][k] + map[k][j] < map[i][j]) {
map[i][j] = map[i][k] + map[k][j];
}
}
}
}
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int i,j,temp,temp2,temp3;
while((n=sc.nextInt())!=0){
map=new int[n+1][n+1];
for(i=0;i<=n;i++){
for(j=0;j<=n;j++){
map[i][j]= (i==j)? 0:INF;
}
}
for(i=1;i<=n;i++){
temp=sc.nextInt();
for(j=1;j<=temp;j++){
temp2=sc.nextInt();
temp3=sc.nextInt();
map[i][temp2]=temp3;
}
}
floyd();
int min=INF;
int max;
int number = 0;
for(i=1;i<=n;i++){
max=Integer.MIN_VALUE;
for(j=1;j<=n;j++){
if(map[i][j]>max)
max=map[i][j];
}
if(max!= INF && max!=0 && max<min){
min=max;
number=i;
}
}
if(min==INF)
System.out.println("disjoint");
else
System.out.println(number+" "+min);
}
}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

最新文章

  1. jboss hello world
  2. Bootstrap_让Bootstrap轮播插件carousel支持左右滑动手势的三种方法
  3. Android OpenCV 图像识别
  4. python 下划线的使用(转载:安生犹梦 新浪博客)
  5. Android实例-获取安卓手机WIFI信息(XE8+小米2)
  6. ZOJ 3728 Collision
  7. FTP配置的一些笔记
  8. ASP.NET Core部署到Windows IIS
  9. ASP.NET Web API系列教程(目录)(转)
  10. supervisorctl安装使用文档
  11. 在Visual Studio中使用C++创建和使用DLL
  12. 如何启动Intel VT-X及合理利用搜索
  13. Linux基础学习(7)--用户和用户组管理
  14. nohup 让进程在后台可靠运行的几种方法
  15. Docker:Swarms
  16. 高可用Hadoop平台-运行MapReduce程序
  17. 在mui中创建aJax来请求数据..并展示在页面上
  18. orge资源
  19. loadrunner运行时设置中清空缓存方法
  20. 新鲜出炉!9个超高分辨率的iPhone 6原型素材打包下载

热门文章

  1. Feign-独立使用-实战
  2. centos7 使用postgres
  3. SMARTFORMS 字段格式化设置
  4. Java多线程系列 面试题
  5. crontab 定时器
  6. 在ubuntu上为android系统编写Linux驱动程序【转】
  7. mac活动监视器闪退
  8. 访问虚拟机中的架设的Web服务器
  9. 解决xhost: unable to open display &quot;&quot;
  10. js 处理移动端触摸事件