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; }