dijstra算法:
#include<iostream>
#include<string.h>
#define N 1001
#define M 99999999
#define FOR(i,s,t) for(int i=(s);i<=(t);++i)
using namespace std;
int n;
int map[N][N];
int dist[N];
bool visit[N];
int main()
{ while(cin>>n,n)
{ memset(map,0,sizeof(map));
FOR(i,1,n)
{ int m;
cin>>m;
if(!m) continue;
FOR(j,1,m)
{ int a,b;
cin>>a>>b;
map[i][a]=b;
}
}
int mmin=M,mink;
FOR(i,1,n)
{ int now=i;
bool bb=true;
FOR(j,1,n)
{ dist[j]=M;
visit[j]=true;
}
dist[now]=0;
visit[now]=false;
FOR(k,1,n)
{ int minx=M;
FOR(j,1,n)
if(visit[j]&&map[now][j]&&dist[j]>dist[now]+map[now][j])
dist[j]=dist[now]+map[now][j];
FOR(j,1,n)
if(visit[j]&&minx>dist[j])
minx=dist[now=j];
visit[now]=false;
}
int _max=0;
FOR(p,1,n)
if(dist[p]==M)
{bb=false;break;}
if(bb)
{ FOR(p,1,n)
if(dist[p]>_max) _max=dist[p];
if(mmin>_max) mmin=_max,mink=i;
}
}
if(mmin<M&&mmin!=0) cout<<mink<<" "<<mmin<<endl;
else cout<<"disjoint"<<endl;
} return 0;
}