題目連接:http://acm.pku.edu.cn/JudgeOnline/problem?id=1125
1125:Stockbroker Grapevine
具体要求:
输入n个经纪人,第i个经纪人分别认识那几个其他的经纪人,而且知道这个经纪人与其他认识的经纪人交流信息所需要的时间。这时有一个虚假的消息要从其中一个经纪人传播出去,要求输出从哪个经纪人出发能够以最短的时间就能使每个人都知道这个虚假的消息。
算法思想:
运用最短路径的知识,分别得出从第i个经纪人出发传到其他经纪人的时间,通过比较选出一个时间,使得在这个时间内就能从第i个经纪人出发传播到其他人去。依次得出这n个时间段,再通过比较这n个时间段的值,数值最小的就是所要得出的最短时间,并且输出这个最短时间的经纪人。
利用佛罗伊德算法得出每一个经纪人间的最短路径。
算法实现:
main()
{
int i,n;
int a[101][101], max, m[101], flag, j, k, a1, n1, b ;
int min ;
while( scanf("%d",&n)&&n)
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=(i==j)?0:-1; //除对角线外,其它都只为-1,对角线值为0;
for(i=1;i<=n;i++)
{
scanf("%d",&n1);
while(n1--)
{
scanf("%d%d",&a1,&b);
a[i][a1]=b;
}
} //初始矩阵;
for(k=1;k<=n;k++)
{
for(j=1;j<=n;j++)
if(a[k][j]==-1)
a[k][j]=1200; //两点之间没有路径,则值置为1200(无穷大的意思);
}
for(i=1;i<=n;i++)
for(k=1;k<=n;k++)
for(j=1;j<=n;j++)
a[k][j]=(i==k||i==j||k==j)?a[k][j]:((a[k][j]<(a[k][i]+a[i][j])?a[k][j]:(a[k][i]+a[i][j]))); //floyd的模板代码
for(i=1;i<=n;i++) // 得出对应的经纪人与其他经纪人间传播消息的最短路径;
{
max=0;
for(j=1;j<=n;j++)
max=max>a[i][j] ? max : a[i][j];
m[i]=max; 得出最长的时间并存入一维数组;
}
flag=0;
min=1200;
for(i=1;i<=n;i++)
{
if(min>m[i])
{
min=m[i];
flag=i;
}
}
if(flag)
printf("%d %d\n",flag,min);
}
return 0;
}
做题心得:
这道题目最难的是在理解佛罗伊德算法的意思上,对于这个算法还是很模糊,同时也上网查了查,知道是得出两个顶点间的最短路径。因此通过这个结果,就能够得出输出结果。