//poj1125 传播图 怎样传播才能最快让所有人都获知消息
//floyd算法 如果AB + BC < AC, AC = AB + BC 一次ac,我突然感觉自己好厉害
#include <iostream>
#include <cmath>
#include <iomanip>
#include <algorithm>
using namespace std;
int inf = 100000;
int t[105][105];
int max1[105];
int index[105];
int getMax(int *a, int n)
{
sort(a + 1, a + n + 1);
return a[n];
}
int main()
{
int n;
cin>>n;
while(n)
{
memset(t, 0, sizeof(t));
memset(max1, 0, sizeof(max1));
memset(index, 0, sizeof(index));
int k, p;
for(int i = 1; i <= n; i++)
{
cin>>k;
for(int j = 0; j < k; j++)
{
cin>>p;
cin>>t[i][p];
}
}
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(!t[i][j] && i != j)
t[i][j] = inf;
//floyd算法
for(int k = 1; k <= n; k++)
{
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
if(t[i][k] + t[k][j] < t[i][j])
t[i][j] = t[i][k] + t[k][j];
}
}
}
for(int i = 1; i <= n; i++)
index[i] = i;
for(int i = 1; i <= n; i++)
{
max1[i] = getMax(t[i], n);
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n - i; j++)
{
if(max1[j] > max1[j+1])
{
int temp = max1[j];
max1[j] = max1[j+1];
max1[j+1] = temp;
temp = index[j];
index[j] = index[j+1];
index[j+1] = temp;
}
}
}
if(max1[1] > inf)
cout<<"disjoint"<<endl;
else
cout<<index[1]<<" "<<max1[1]<<endl;
cin>>n;
}
return 0;
}
poj1125 Floyd算法
最新推荐文章于 2018-07-15 11:24:42 发布