Floyd算法_Poj_1125

//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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章