题意:你是一个股票经纪人,现在要你去散布一些谣言来为你的雇主服务。你需要找到最快的一个方法将谣言传到所有人那里,但是谣言只能从一些人传到另一些特定的人而不能随意传递。现在,让你求出最少将谣言传遍所需要的时间和起始点的坐标。
思路:直接Floyd求出所有点之间的最短路,然后枚举第一个到第n个点,每次枚举找出以该点位起点位置到其余点的最长边。然后从n个最长边里面找出一个值最小的即可,即为所需的最短传播时间。
#include<stdio.h>
#define maxn 99999999
int dist[1000][1000];
int main()
{
int m,n,q,i,j,k,ans,count,max;
while(scanf("%d",&n)&&n!=0)
{
ans=-maxn,count=1;//ans是最后输出的最短边,count表示起点是count
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
dist[i][j]=maxn;
for(i=1;i<=n;i++)
dist[i][i]=0;
for(i=1;i<=n;i++)
{
scanf("%d",&m);
for(j=1;j<=m;j++)
{
scanf("%d",&q);
scanf("%d",&dist[i][q]);
}
}//建图与预处理完毕
for(i=1;i<=n;i++)//直接Floyd算法
for(j=1;j<=n;j++)
for(k=1;k<=n;k++)
if(dist[j][k]>dist[j][i]+dist[i][k])
dist[j][k]=dist[j][i]+dist[i][k];
for(i=2;i<=n;i++)
if(ans<dist[1][i])
ans=dist[1][i];
for(i=2;i<=n;i++)
{
max=-maxn;//max表示从第i个点到其他点最长的一条边
for(j=1;j<=n;j++)
if(max<dist[i][j])
max=dist[i][j];
if(ans>max)
{
ans=max;
count=i;
}
}
printf("%d %d\n",count,ans);
}
return 0;
}