hdu 1102 Constructing Roads
此题是最小生成树的基础题
#include<stdio.h> #include<string.h> #include<stdlib.h> int set[124],n,t,a,b,c; long long min; struct map { int x,y,val; }m[ 100000 ]; int cmp( const void *a,const void *b ) { return ( ( map * ) a ) -> val - ( ( map * ) b ) -> val; } int find( int i ) { return set[ i ] == i ? i :set[ i ] = find( set[ i ] ); } void merge( int x,int y ) { int a = find( x ),b = find( y ); if( a != b ) set[ a ] = b; } void K( ) { for( int i = 1;i <= c; ++i ) { int a = find( m[ i ].x ),b = find( m[ i ].y ),val = m[ i ].val; if( a != b ) { set[ a ] = b; min += val; } } } int main( ) { while( scanf( "%d",&n ) != EOF ) { for( int i = 1; i <= 123 ; ++i ) set[ i ] = i; c = 1; for( int i = 1; i <= n; ++i ) { for( int j = 1 ; j <= n; ++j ) { int val; scanf( "%d", &val ); if( j >= i )//因为矩阵是对称的所以只要存入一半就可以了 { m[ c ].x = i; m[ c ].y = j; m[ c ].val = val; ++c; } } } qsort( m + 1,c,sizeof( m[ 0 ] ),cmp ); scanf( "%d",&t ); while( t-- ) { scanf( "%d%d",&a,&b ); merge( a,b );//将以连接的合并成一个集合 } min = 0; K( ); printf( "%I64d\n",min ); } return 0; }
本人还是新手 ,转载请注明来自Lvsi‘s home