#include <iostream> using namespace std; #define MAX 101 #define INF 100000 int matrix[MAX][MAX]; int main() { int i,j,k; int N,n; int adj; while(scanf("%d",&N) && N) { //input for(i=1;i<=N;i++) for(j=1;j<=N;j++) if(i!=j) matrix[i][j]=INF; for(i=1;i<=N;i++) { scanf("%d",&n); for(j=1;j<=n;j++) { scanf("%d",&adj); scanf("%d",&matrix[i][adj]); } } //Floyd for(k=1;k<=N;k++) for(i=1;i<=N;i++) for(j=1;j<=N;j++) if(matrix[i][k]+matrix[k][j]<matrix[i][j]) matrix[i][j]=matrix[i][k]+matrix[k][j]; //output int max,begin=0; //max为单源点到其他顶点的最大值 int MinCost=INF; //minCost为所求max的最大值 for(i=1;i<=N;i++) { max=-1; for(j=1;j<=N;j++) if(matrix[i][j]>max) max=matrix[i][j]; if(max<MinCost) { begin=i; MinCost=max; }//minimum of max (MinCost) } if(MinCost!=INF) printf("%d %d/n",begin,MinCost); else printf("disjoint/n"); } return 0; } // 每一对顶点之间的最短路径 Floyd算法 O(n^3) //Attenion: 每个人可以同时传播消息给其他人,找出一点到其它点 //的距离的最大值(即传播的最大时间)在枚举每一个点求出每一点的 //最大值中的最小者,即为所求.