您的位置:首页 > 其它

poj:1125Floyd(求任意点之间的最短路)

2016-08-17 20:45 344 查看
题目大意:

给出每个人之间的关系,只有在朋友之间才可以传递信息,问选择哪一个人为起点可以在最短的时间内让所有人得知消息,输出人的编号和最短时间;如果不行则输出disjoint;

思路:

由于是求任意点之间最短路问题,我们可以用Floyd算法;

先求出任意点之间的最短路,然后枚举每一种情况,求其到其他点的最大值,然后求这些值当中的最小值;

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define inf 0x3f3f3f3f
int p[109][109];
int main()
{
int n;
while(scanf("%d",&n)&&n)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(i==j) p[j][i]=0;
else p[i][j]=inf;
}
for(int i=1;i<=n;i++)
{
int m,v,val;
scanf("%d",&m);
for(int j=1;j<=m;j++)
{
scanf("%d%d",&v,&val);
p[i][v]=val;
}
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
p[i][j]=min(p[i][j],p[i][k]+p[k][j]);
int aim=0,ans=inf;
for(int i=1;i<=n;i++)
{
int tmp=0;
for(int j=1;j<=n;j++)
{
tmp=max(tmp,p[i][j]);
}
if(ans>tmp)
{
ans=tmp;
aim=i;
}
}
if(aim)
printf("%d %d\n",aim,ans);
else puts("disjoint");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: