Floyd算法简介:
连接任何两个点i和j,假设通过第三个点k,如果a[i][j]>a[i][k]+a[k][j],则a[i][j]=a[i][k]+a[k][j];也就是说,如果原来i和j之间的距离大于i到k与k到j距离之和,那么i和j之间的最短距离就要发生改变。
这个题理解起来有点难度,其实是要求出由某个人向其他所有人发短信所用的最短时间,而一个人完成这项工作最快用时是由他人发短信花费最长时间决定的。于是,可以先用Floyd算法求出从i到j的最短联通时间a[i][j],然后对应每一个i,求出到j的最长联通时间,最后从这些时间中求出答案。可能听起来不太懂,具体看程序吧。
Floyd第一道!!!!!
源程序:
#include<stdio.h>
#define max 999999
#define N 102
int a[N][N];
int main()
{
int n,v,i,j,k,m,s,t,r,u;
while(scanf("%d",&n)&&(n>0))
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(i==j)
a[i][j]=0;
else a[i][j]=max;
}
for(i=1;i<=n;i++)
{
scanf("%d",&m);
while(m--)
{
scanf("%d%d",&s,&t);
a[i][s]=t;
}
}
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
if(a[i][j]>a[i][k]+a[k][j])
a[i][j]=a[i][k]+a[k][j];
}
v=max;r=-1;
for(i=1;i<=n;i++)
{
u=-1;
for(j=1;j<=n;j++)
{
if(u<a[i][j])
u=a[i][j];
}
if(u<v)
{
v=u;
r=i;
}
}
if(r==-1)
printf("disjoint\n");
else printf("%d %d\n",r,v);
}
return 0;
}