还木有吃中午饭,好饿。。速度打包去。。
/* zoj_1082 最短路 题意:要在N个人中传播谣言,每个人传播谣言给他可以联系的人都有个时间,求从哪个人开始传播 谣言并使谣言传遍所有人的时间最短。 基本上就是模板题,对每个人为起点都进行一次dijk,取最小就行。 */ #include <iostream> #include <cstdio> #include <string.h> #include <limits.h> using namespace std; int map[110][110]; int dist[110]; bool flag[110]; int dijkstra( int start,int n ) { int i,j,mark,mini,maxi; memset( dist,0,sizeof(dist) ); memset( flag,0,sizeof(flag) ); flag[start]=1; maxi=0; for( j=0;j<n;j++ ) { mini=INT_MAX; for( i=1;i<=n;i++ ) { if( flag[i]==0 ) { if( map[start][i]!=0 && dist[i]==0 ) dist[i]=dist[start]+map[start][i]; else if( map[start][i]!=0 && dist[i]>dist[start]+map[start][i] ) dist[i]=dist[start]+map[start][i]; if( dist[i]<mini && dist[i]!=0 ) { mini=dist[i]; mark=i; } } } if( mini==INT_MAX ) break; if( dist[mark]>maxi ) maxi=dist[mark]; flag[mark]=1; start=mark; } if( j==n-1 ) return maxi; else return INT_MAX; } int main() { int n,m,i,j,k; int time,mini,temp,mark; while( scanf( "%d",&n ) && n ) { memset( map,0,sizeof(map) ); for( i=1;i<=n;i++ ) { scanf( "%d",&m ); for( j=0;j<m;j++ ) { scanf( "%d%d",&k,&time ); map[i][k]=time; } } mini=INT_MAX; for( i=1;i<=n;i++ ) if( ( temp=dijkstra( i,n ) )<mini ) { mark=i; mini=temp; } if( mini==INT_MAX ) printf( "disjoint\n" ); else printf( "%d %d\n",mark,mini ); } return 0; }