LeeBlog

导航

hdu 1863 畅通工程

这题是刚学最小生成树的一入门题,其实就是求最小生成树,用结构体定义这棵树,到时候便于权值排序,输入后进行排序,让后再讲这些顶点连成一个集合,并在这过程中把各权值相加(因为这些权值已按递增排列,所以得出的集合时权值最小的),至于是否能保证畅通则只要看有几个根结点就可以了

#include<stdio.h>
#include
<stdlib.h>
#include
<string.h>
int set[1000],n,m,x,y,val;
struct Ed
{
int x,y,val;
}e[
10000];
int cmp( const void *a,const void *b )
{
return (( Ed * )a)-> val - ( ( Ed * ) b ) -> val;
}
int find( int i )
{
return set[ i ] == i ? i : set[ i ] = find( set[ i ] );
}
int Kruskal( )
{
int sum = 0;
for( int i = 0; i < n;++i )
{
int x = e[ i ].x,y = e[ i ].y,val = e[ i ].val,i = find( x ),j = find( y );
if( i != j )
{
sum
+= val;
set[ i ] = j ;
}
}
return sum;
}
int main ( )
{
while( scanf( "%d%d" , &n,&m ) == 2 && n )
{
for( int i = 0; i <= m ; ++i )
set[ i ] = i;
for( int i = 0; i < n ; ++i )
{
scanf(
"%d%d%d",&x,&y,&val );
e[ i ].x
= x;
e[ i ].y
= y;
e[ i ].val
= val;
}
qsort( e,n,
sizeof( e[ 0 ] ),cmp );
int res = Kruskal( );
int i,c;
for( i = 1, c = 0; i <= m ; ++i )
{
if( set[i] == i )
++c;
if( c > 1 )
break;
}
c
> 1 ? printf( "?\n" ) : printf( "%d\n",res );
}
return 0;
}

posted on 2011-02-26 09:34  LeeBlog  阅读(212)  评论(0编辑  收藏  举报