最小生成树,题目的Input中有各个细节的说明,按部就班完成即可。
Run Time: 0.01sec
Run Time: 0.01sec
Run Memory: 304KB
Code length: 1294Bytes
SubmitTime: 2012-01-12 12:11:41
// Problem#: 1083
// Submission#: 1190010
// 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 P, R;
int i, j;
int add, min, temp, total;
int cable[ 51 ][ 51 ];
bool included[ 51 ];
int length[ 51 ];
while ( scanf( "%d", &P ) && P ) {
for ( i = 1; i <= P; i++ ) {
included[ i ] = false;
for ( j = 1; j <= P; j++ )
cable[ i ][ j ] = 101;
}
scanf( "%d", &R );
while ( R-- ) {
scanf( "%d%d%d", &i, &j, &temp );
if ( temp < cable[ i ][ j ] )
cable[ i ][ j ] = cable[ j ][ i ] = temp;
}
total = 0;
included[ 1 ] = true;
for ( i = 1; i <= P; i++ )
length[ i ] = cable[ 1 ][ i ];
for ( j = 2; j <= P; j++ ) {
min = 101;
for ( i = 1; i <= P; i++ ) {
if ( !included[ i ] && length[ i ] < min ) {
add = i;
min = length[ i ];
}
}
total += min;
included[ add ] = true;
for ( i = 1; i <= P; i++ ) {
if ( !included[ i ] && cable[ add ][ i ] < length[ i ] )
length[ i ] = cable[ add ][ i ];
}
}
printf( "%d\n", total );
}
return 0;
}