题目描述
Stockbroker Grapevine
众所周知,证券经纪业依靠的就是过度的传言。您需要想出股票经纪人中传播假情报的方法,让您的雇主在股票市场的占据优势。为了获得最大的效果,你必须蔓延最快的方式谣言。
不幸的是你,股票经纪人信息只信任他们的“可靠来源”,这意味着你在你传播谣言之前必须考虑到他们的接触结构。它需要特定股票经纪人和一定的时间把谣言传递给他的每一位同事。你的任务将是写一个程序,告诉您选择哪一个股票经纪人作为谣言的出发点和所花费多少时间将谣言扩散到整个社会的股票经纪人。这一期限是衡量过去的人收到信息所需的时间。
输入
你的程序包含多组股票经纪人的输入数据。每组以股票经纪人的人数开始。接下来的几行是每个经纪人与其他人接触的一些信息,包括这些人都是谁,以及将讯息传达到他们所需的时间。每个经纪人与其他人接触信息的格式如下:开头的第一个数表示共有n个联系人,接下来就有n对整数。每对整数列出的第一个数字指的是一个联系人(例如,一个’1’是指编号1的人),其次是在传递一个信息给那个人时所采取分钟的时间。没有特殊的标点符号或空格规则。
每个人的编号为1至经纪人数目。所花费的传递时间是从1到10分钟(含10分种)。股票经纪的人数范围是从1到100。当输入股票经纪人的人数为0时,程序终止。
题目思路
- 经典flyod,flyod模板可见我之前博客最短路径 flyod模板
- 最后需要考虑每个联系人将讯息传达到其他联系人的时间中最长的时间,也就是每个联系人传达消息至少所需的时间,再在n个联系人中选出所需至少时间最小的,如果这个时间不是inf,那说明联系人之间是可达的,如果是inf,那说明联系人之间存在不可达,输出disjoint
代码
#include <iostream>
#include<stdio.h>
using namespace std;
#define inf 0x3f3f3f3f
#define max 100
int dis[max][max];
int final[max];
int main() {
freopen("in.txt","r",stdin);
int n,m,p,s;
while(1){
cin>>n;
if(n==0) break;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j) dis[i][j]=0;
else dis[i][j]=inf;
}
}
for(int i=1;i<=n;i++){
cin>>m;
for(int j=1;j<=m;j++){
cin>>p>>s;
dis[i][p]=s;
}
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(dis[i][j]>dis[i][k]+dis[k][j]){
dis[i][j]=dis[i][k]+dis[k][j];
}
}
}
}
//n个联系人中所需至少时间最少的时间
int min=inf,u;
for(int i=1;i<=n;i++){
int maxDis=0;
for(int j=1;j<=n;j++){
//每个联系人传达消息至少所需的时间maxDis
if(dis[i][j]>maxDis){
maxDis=dis[i][j];
final[i]=maxDis;
}
}
if(min>maxDis){
min=maxDis;
u=i;
}
}
if(min<inf){
cout<<u<<" "<<min<<endl;
}else{
cout<<"disjoint"<<endl;
}
}
fclose(stdin);
return 0;
}