/*
首先,題目可能有多組測試資料,每個測試資料的第一行為經紀人數量N(當N=0時,
輸入資料結束),然後接下來N行描述第i(1<=i<=N)個經紀人與其他經紀人的關系
(教你如何畫圖)。每行開頭數字M為該行對應的經紀人有多少個經紀人朋友(該節點
的出度,可以為0),然後緊接着M對整數,每對整數表示成a,b,則表明該經紀人向第a
個經紀人傳遞資訊需要b機關時間(即第i号結點到第a号結點的孤長為b),整張圖為
有向圖,即弧Vij 可能不等于弧Vji(資料很明顯,這裡是廢話)。當構圖完畢後,求
當從該圖中某點出發,将“消息”傳播到整個經紀人網絡的最小時間,輸出這個經紀
人号和最小時間。最小時間的判定方式為——從這個經紀人(結點)出發,整個經紀
人網絡中最後一個人接到消息的時間。如果有一個或一個以上經紀人無論如何無法收
到消息,輸出“disjoint”(有關圖的連通性,你們懂得,但據其他同學說,POJ測試
資料中不會有,就是說,你不判定,一樣能過,題目資料夠水的)。
以第一樣例為例:
3
2 2 4 3 5
2 1 2 3 6
2 1 2 2 2
總共3個經紀人,一号經紀人可向2個人傳遞資訊,向2号傳遞所需時間為4分鐘,向3号
傳遞需5分鐘。二号經紀人可向2個人傳遞資訊,向1号需2分鐘,向3号需6分鐘。三号
經紀人可向2人傳遞資訊,向1号需2分鐘,向2号需2分鐘。(以上阿拉伯數字即為對
應資料)
将圖畫出,很容易得出,從3号出發,網絡中最後一個得到消息的,
需2分鐘(可以同時向多人傳遞,有點不合情理)。是以輸出為 3 2。
*/
#include<stdio.h>
int stb[102][102];
int min(int x,int y){return x<y?x:y;}//求最小值
void Floyd(int n)
{
int i,j,k;
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
stb[i][j]=min(stb[i][j],stb[i][k]+stb[k][j]);
}
int main()
{
int i,j;
int num,num1,n,dis;
int line,ansmix,linemax;
//freopen("in.txt","r",stdin);
while(scanf("%d",&num)&&num)//輸入,num為0結束
{
for(i=1;i<=num;i++)//數組初始化
for(j=1;j<=num;j++)
stb[i][j]=1000010;
for(i=1;i<=num;i++)
{
scanf("%d",&num1);
stb[i][i]=0;
for(j=0;j<num1;j++)
{
scanf("%d %d",&n,&dis);
stb[i][n]=dis;//輸入資料
}
}
Floyd(num);//找出每兩個點的最短路徑
ansmix=1000010;
for(i=1;i<=num;i++)
{
linemax=0;
for(j=1;j<=num;j++)
{
/*找出所有最短路徑最長的長度,也就是第i個人向其他人發出
消息,所有人都收到消息的最短時間*/
if(stb[i][j]>linemax)
{
linemax=stb[i][j];
}
}
if(linemax<ansmix)
{
ansmix=linemax;//找出最短時間
line=i;//确定是哪個人
}
}
if(ansmix==1000010)
printf("disjoint\n");
else
printf("%d %d\n",line,ansmix);
}
}