这个题很水,后台数据相当弱,写这个只是记录一下。
再次吐槽一下,那个不联通的情况(输出“disjoint”)甚至都不用输出,输出错了也没事。。
用的Foyld, 0MS;
贴一下代码:
#include <stdio.h>
#include <math.h>
const int inf=1<<30;
const int V=105;
int in=1;
int map1[V][V];
int min(int a, int b)
{
if(a<=b) return a;
return b;
}
void flody(int n)
{
int i,j,k;
for(k=1; k<=n; k++)
{
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
if(map1[i][k]!=inf&&map1[k][j]!=inf&&map1[i][j]>map1[i][k]+map1[k][j])
{
map1[i][j]=map1[i][k]+map1[k][j];
}
}
}
}
}
int main()
{
int n;
while(scanf("%d",&n),n)
{
int i,j,t,a,b,min1,mini,flat,max1;
for(i=0; i<=n; i++)
{
for(j=0; j<=n; j++)
{
map1[i][j]=inf;
if(i==j)
{
map1[i][j]=0;
}
}
}
for(i=0; i<n; i++)
{
scanf("%d",&t);
for(j=0; j<t; j++)
{
scanf("%d%d",&a,&b);
map1[i+1][a]=b;
}
}
flody(n);
min1=inf;
for(i=1; i<=n; i++)
{
max1=0;
for(j=1;j<=n;j++)
{
if(map1[i][j]>max1)
{
max1=map1[i][j];
}
}
if(max1<min1)
{
min1=max1;
mini=i;
}
}
if(min1==inf)
{
printf("disjoint\n");
}
else
{
printf("%d %d\n",mini,min1);
}
}
return 0;
}