您的位置:首页 > 其它

HDU 1879 继续畅通工程

2011-09-18 11:13 411 查看
这题就是注意一下当状态为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 ));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: