HDU 3371 Connect the Cities

我用G++提交就TLE了,而用C++提交就过了,这题就是一个并查集与克鲁斯卡尔。

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