/* 解题报告:Floyd法最短路径 1、 先用Floyd法求出所有点对之间的最短路径,然后 计算a[i] = Max(g[i][j])(1<=i<=j),数组a中的最小值为最 短时间,对应的下标就是开始的那个人 */ #include <iostream> #include <climits> using namespace std; const int nMax = 0xffff; int g[101][101]; //存储图的邻接矩阵 int n; void Init() { for(int i=1; i<=n; ++i) { for(int j=1; j<=n; ++j) { if(i == j) g[i][j] = 0; else g[i][j] =nMax; } } } //Floyd法求各对点的最短路径 void FloydShortes() { for(int k=1; k<=n; ++k) { for(int i=1; i<=n; ++i) { for(int j=1; j<=n; ++j) if(g[i][j] > g[i][k] + g[k][j]) g[i][j] = g[i][k] + g[k][j]; } } } int main() { while(cin>>n && n) { Init(); //构造邻接矩阵 for(int i=1; i<=n; ++i) { int k; cin>>k; for(int j=0; j<k; ++j) { int a, b; cin>>a>>b; g[i][a] = b; } } //寻找最短路径 FloydShortes(); int nNum; int nTime = nMax; for(int i=1; i<=n; ++i) { int nRowMax = 0; for(int j=1; j<=n; ++j) { if(g[i][j] > nRowMax) nRowMax = g[i][j]; } if(nTime > nRowMax) { nTime = nRowMax; nNum = i; } } if(nTime == nMax) cout<<"disjoint"<<endl; else cout<<nNum<<" "<<nTime<<endl; } return 0; }