Floyd算法_Poj_1125

来源:互联网 发布:查电脑mac地址命令 编辑:程序博客网 时间:2024/05/17 05:15

//Floyd算法虽然写起来相当的简单,但如果要仔细理解,还是要那么点时间的,想了两小时,呵呵,脑子不太灵光

#include<iostream>

using namespace std;
int n,m;
int Path[101][101];
int main()
{
int i,j,do_i,do_path;
while(cin>>n,n>0)
{
//初始化相连矩阵
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
Path[i][j]=99999;
}
for(i=1;i<=n;i++)
{
cin>>m;
while(m--)
{
cin>>do_i>>do_path;
Path[i][do_i]=do_path;
}
Path[i][i]=0;
}
//floyd算法
int k;
for(k=1;k<=n;k++)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(Path[i][k]+Path[k][j]<Path[i][j])
Path[i][j]=Path[i][k]+Path[k][j];
}
}
}
//找出所有‘遍布全图的最大路径’的最小路径
int min_lenth=99999,min_i,min_max_lenth;
bool IsOk;
for(i=1;i<=n;i++)
{
IsOk=true;
min_max_lenth=-1;
for(j=1;j<=n;j++)
{
if(Path[i][j]==99999)
{
IsOk=false;
break;
}
else if(Path[i][j]>min_max_lenth)
min_max_lenth=Path[i][j];
}
if(IsOk && min_max_lenth>0 && min_max_lenth<min_lenth)
{
min_lenth=min_max_lenth;
min_i=i;
}
}
if(min_lenth==99999) printf("disjoint\n");
else printf("%d %d\n",min_i,min_lenth);
}
return 0;
}
原创粉丝点击