用弗洛伊德算法求解的是所有的顶点到所有的顶点的最短路径,时间复杂度为O(n^3),代码只有三个for循环,非常简洁。
Poj1125oj(http://poj.org/problem?id=1125),适合此算法,题意:
输入第一个N,代表经济人人数,之后N行分别为第1到N个经济人,传递网络信息到别的经济人的情况,意思分别为能传递M个经济人,传递给a,传递花费时间b,构建完成图之后输出花费时间最多的时间以及第几个经纪人
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
int map[105][105],n,m;
void Floyd()//弗洛伊德算法
{
for(int k=1;k<=n;k++)//中间添加的 第k个人
for(int i=1;i<=n;i++)//第i个人
for(int j=1;j<=n;j++)//第j个人
{
map[i][j]=min(map[i][j],map[i][k]+map[k][j]);//比较 挑选出花费时间最小的路径
}
}
int main()
{
int a,b;
while(~scanf("%d",&n))
{
if(n==0)return 0;
int ans=0x3f3f3f3f,peo;//ans 最大值初始化,16进制
memset(map,INF,sizeof(map));//通常对角设置成0,自身到自身的距离
for(int i=0;i<n;i++)
{
scanf("%d",&m);
for(int j=0;j<m;j++)
{
scanf("%d%d",&a,&b);
map[i+1][a]=b;
}
}
Floyd();
for(int i=1;i<=n;i++)
{
int temp=0;
for(int j=1;j<=n;j++)
{
if(i==j)
continue;//将自己到自己的距离忽视,不进行比较
if(map[i][j]>temp)
temp=map[i][j];
}
if(ans>temp)
{
ans=temp;
peo=i; //标记是哪个人
}
}
printf("%d %d\n",peo,ans);
}
return 0;
}