求任意两点之间的最短路径最大值的最小值,听起来有点绕口,不过数据结构课程设计里面
给出了这个概念,叫做偏心度,就是一个点到途中任一点的距离要最小,先用floyd求出任
意两点之间的最短路,再枚举每一个点到其他点的最短距离,找出其中最大那个,和其
他的最大值来比较,找出全图的最小值。
/*Accepted 168K 0MS C++ 1217B 2012-07-26 15:42:29*/ #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> using namespace std; const int MAXN = 1 << 7; int f[MAXN][MAXN], n, m, T, Min; void ReadGragh() { for( int i = 1; i <= n; i ++) for( int j = 1; j <= n; j ++) { if( i != j) f[i][j] = MAXN * 10; else f[i][j] = 0; } for( int i = 1; i <= n; i ++) { int x; scanf( "%d", &x); while( x --) { int t; scanf( "%d", &t); scanf( "%d", &f[i][t]); } } } void floyd() { for( int k = 1; k <= n; k ++) for( int i = 1; i <= n; i ++) for( int j = 1; j <= n; j ++) f[i][j] = min( f[i][j], f[i][k] + f[k][j]); Min = MAXN * 10; for( int i = 1; i <= n; i ++) { int Max = 0; for( int j = 1; j <= n; j ++) Max = max( f[i][j], Max); if( Min > Max) { Min = Max; T = i; } } } int main() { while( scanf( "%d", &n), n) { ReadGragh(); floyd(); printf( "%d %d\n", T, Min); } }
浙公网安备 33010602011771号