2011/07/14 12:49
#include<iostream>
#define N 105
using namespace std;
int n,d[N],w[N][N];
const int INF = 0x7fffffff;
void DFS(int s)
{
int i;
for(i=1;i<=n;i++){
if(w[s][i]>0&&d[i]==0) {
d[i]=1; //cout<<i<<endl;
DFS(i);
}
//cout<<"s:"<<w[s][1]<<endl;
}
return ;
}
void Dijkstra(int s)
{
int i,j,min,index;
int flag[N]={0};
for(i=1;i<=n;i++) d[i]= INF;
d[s]=0;
for(i=1;i<=n;i++)
{
min = INF;
for(j=1;j<=n;j++)
{
if(!flag[j]&&min>d[j])
{
min =d[j];
index = j;
}
}
flag[index]=1;
for(j=1;j<=n;j++)
{
if(w[index][j]>0&&d[j]>d[index]+w[index][j])
d[j]=d[index]+w[index][j];
}
}
}
int main()
{
int i,j,k;
while(~scanf("%d",&n)&&n)
{
int m,v,time,index,min,max;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) w[i][j]=-1;
for(i=1;i<=n;i++)
{
scanf("%d",&m);
for(j=0;j<m;j++)
{
scanf("%d%d",&v,&time);
w[i][v]=time;
}
}
//for(i=1;i<=n;i++) {for(j=1;j<=n;j++) cout<<w[i][j]<<" "; cout<<endl;}
min=INF;
for(i=1;i<=n;i++)
{
for(k=1;k<=n;k++) d[k]=0;
d[i]=1;
DFS(i);
for(k=1;k<=n;k++)
{
if(d[k]==0) break;
}
if(k<=n) continue;
Dijkstra(i);
max=-1;
for(j=1;j<=n;j++) if(d[j]>max) max=d[j];
if(min>max) {min=max; index=i; }
}
if(min<INF) printf("%d %d\n", index,min);
else printf("disjoint\n");
}
return 0;
}