最小生成树,在这里用的是Prim最小生成树算法(其实是因为从没看过Kruskal最小生成树算法的代码),中规中矩地做完就行了。
Run Time: 0.07sec
Run Memory: 1160KB
Code length: 1262Bytes
SubmitTime: 2012-01-06 18:22:10
// Problem#: 1090
// Submission#: 1177569
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
#include <cstdio>
using namespace std;
int main()
{
int T, N;
int i, j;
int road[ 501 ][ 501 ];
int add, min, max;
bool included[ 501 ];
int dist[ 501 ];
scanf( "%d", &T );
while ( T-- ) {
scanf( "%d", &N );
for ( i = 1; i <= N; i++ ) {
for ( j = 1; j <= N; j++ )
scanf( "%d", &road[ i ][ j ] );
}
for ( i = 1; i <= N; i++ ) {
included[ i ] = false;
dist[ i ] = 65537;
}
max = 0;
included[ 1 ] = true;
for ( i = 1; i <= N; i++ )
dist[ i ] = road[ 1 ][ i ];
for ( j = 1; j < N; j++ ) {
min = 65537;
for ( i = 1; i <= N; i++ ) {
if ( !included[ i ] && dist[ i ] < min ) {
add = i;
min = dist[ i ];
}
}
included[ add ] = true;
for ( i = 1; i <= N; i++ ) {
if ( !included[ i ] && road[ add ][ i ] < dist[ i ] )
dist[ i ] = road[ add ][ i ];
}
if ( max < min )
max = min;
}
printf( "%d\n", max );
if ( T != 0 )
printf( "\n" );
}
return 0;
}