HDU 1879 继续畅通工程

这题就是注意一下当状态为1是就把这两给点合并到一个集合;

#include<stdio.h>
#include
<stdlib.h>
struct t
{
int x,y,flag,cost;
}kru[
5024];
int set[124];
int cmp( const void *a,const void *b )
{
return ( ( t * )a )->cost-( ( t * )b )->cost;
}
int find( int x )
{
return x==set[x]?x:set[x]=find( set[x] );
}
int kruscal( int N )
{
int sum=0,X,Y;
for( int i=0;i<N; i++ )
{
if( kru[i].flag==0 )
if( ( X=find( kru[i].x ) )!=( Y=find( kru[i].y ) ) )
{
sum
+=kru[i].cost;
set[Y]=X;
}
}
return sum;
}
int main( )
{
int n;
while( scanf( "%d",&n ),n )
{
for( int i=0;i<=n;i++ )
{
set[i]=i;
}
int N=n*( n-1 )/2;
for( int i=0; i<N; i++ )
{
scanf(
"%d%d%d%d",&kru[i].x,&kru[i].y,&kru[i].cost,&kru[i].flag );
if( kru[i].flag==1 )
{
set[find( kru[i].x )]=find( kru[i].y );
}
}
qsort( kru,N,
sizeof( kru[0] ),cmp );
printf(
"%d\n", kruscal( N ));
}
}
posted @ 2011-09-18 11:13  wutaoKeen  阅读(103)  评论(0编辑  收藏  举报