题目链接:http://poj.org/problem?id=1125
解题思路:
没办法,英语太烂了,先上翻译,理解题意。(有道翻译)
股票经纪人小道消息
描述
股票经纪人已知反应过度的谣言。你已经感染发展传播虚假信息的方法在股票经纪人给你的雇主在股票市场的战术优势。为了取得最大的效果,你必须传播谣言的最快的方式。
不幸的是,股票经纪人只信任信息来自他们的“可信来源”这意味着您不得不考虑他们联系的结构时,开始一个谣言。这需要一定的时间为一个特定的股票经纪人通过每个同事的谣言。你的任务是编写一个程序,告诉你股票经纪人选择为起点的传言,以及时间的谣言传遍股票经纪人社区。这个时间测量所需的时间的最后一个人得到的信息。
输入
你的程序将输入数据不同的股票经纪人。每组始于一个股票经纪人的数量。以下为每个股票经纪人这一行包含的数量他们有接触的人,这些人是谁,他们所花费的时间将消息传递给每个人。每个股票经纪人的格式如下:行始于联系人(n)的数量,其次是n双整数,一对为每个接触。每一对列表第一个数字指的是接触(例如' 1 '意味着人第一集),紧随其后的是时间在几分钟内将消息传递给那个人。没有特殊标点符号或间距规则。
每个人编号1到股票经纪人的数量。的时间之间传递消息将1和10分钟(包容),和联系人的数量将范围为0到1之间不到股票经纪人的数量。股票经纪人的数量将从1到100不等。输入终止由一组股票经纪人包含0(零)人。
输出
对于每一组数据,输出一行程序必须包含结果的人在最快的消息传输,以及之前的最后一个人将收到任何消息你给这个人后,以整数分钟。
有可能是你的程序将收到一个网络连接,排除了一些人,比如有些人可能是遥不可及的。如果你的程序检测到这样一个破网络,直接输出消息“分离”。注意,时间将消息从一个人传递给B不一定是一样的时间把它从B,如果这样的传输是可能的。
个人理解:有N个股票经济人可以互相传递消息,他们之间存在一些单向的通信路径。现在有一个消息要由某个人开始传递给其他所有人,问应该由哪一个人来传递,才能在最短时间内让所有人都接收到消息。若是一个破网络,则输出disjoint。
AC代码:
#include<iostream>
#include<cstdio>
using namespace std;
const int INF=0xfffffff;
int edge[110][110];
int n,m;
void init()
{
int i,j;
for(i=1;i<=n;i++)
for(j=i;j<=n;j++)
if(i==j)
edge[i][j]=0;
else
edge[i][j]=edge[j][i]=INF;
for(i=1;i<=n;i++)
{
scanf("%d",&m);
for(j=0;j<m;j++)
{
int x,y;
scanf("%d%d",&x,&y);
edge[i][x]=y;
}
}
}
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(edge[i][k]+edge[k][j]<edge[i][j])
edge[i][j]=edge[i][k]+edge[k][j];
}
int main()
{
while(scanf("%d",&n),n)
{
init();
floyd();
int i,j,k=1; //k作标记
int maxn,minn=INF;
for(i=1;i<=n;i++)
{
maxn=0;
for(j=1;j<=n;j++)
if(j!=i&&edge[i][j]>maxn)
maxn=edge[i][j]; //晕,谣言是同时传播的
if(maxn<minn)
{
minn=maxn;
k=i;
}
}
if(minn!=INF)
printf("%d %d\n",k,minn);
else
printf("disjoint\n");
}
return 0;
}