題目描述
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;
}