//每对顶点之间的最短路径算法floyd,其实是动归,O(n
3),还要注意disjoint
#include<iostream>
using namespace std;
#define M 100
#define INF 20000000
int sb[M+1][M+1];
int d[M+1][M+1];
int n;
int i,j,k;
void Init()
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
sb[i][j]=(i==j?0:INF);
}
void floyd()
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
d[i][j]=sb[i][j];
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(d[i][k]+d[k][j]<d[i][j])
d[i][j]=d[i][k]+d[k][j];
}
int main()
{
int mi,v,w,ri,min,max;
while( scanf("%d",&n)==1 && n!=0)
{
Init();
for(i=1;i<=n;i++)
{
scanf("%d",&mi);
for(j=1;j<=mi;j++) { scanf("%d%d",&v,&w); sb[i][v]=w; }
}
floyd();
min=INF;
ri=-1;
for(i=1;i<=n;i++)
{
max=0;
for(j=1;j<=n;j++)
if(d[i][j]>max) max=d[i][j];
if(max<min) { min=max;ri=i;}
}
if(ri==-1) printf("disjoint\n");
else printf("%d %d\n",ri,min);
}
return 0;
}
posted on 2009-05-24 16:17
wyiu 阅读(188)
评论(0) 编辑 收藏 引用 所属分类:
POJ