HDU-2094 产生冠军

    题中先用并查集判定是否所有点都有联系,即能够拼成一个连通的无向图。 再判定入度为零的点是否为1即可。

代码如下:

#include <stdio.h>
#include <string.h>

char name[2010][50];

int cnt, N, dg[2010], hash[2010], set[2010];

int find( char *n )
{
	int i;
	for( i= 0; i< cnt; ++i )
	{
		if( strcmp( n, name[i] )== 0 )
		{
			return i;
		}
	}
	strcpy( name[cnt], n );
	return cnt++;    // 在return的时候把cnt自增
}

int find( int x )
{
    return set[x]= x== set[x]? x: find( set[x] );
}

void merge( int x, int y )
{
    int a= find( x ), b= find( y );
    set[a]= b;
}

int main(  )
{
	while( scanf( "%d", &N ), N )
	{
		char n1[50], n2[50];
		cnt= 0;
		int edge= 0;
		memset( dg, 0, sizeof( dg ) );
		memset( hash, 0 ,sizeof( hash ) );
		for( int i= 0; i< 2010; ++i )
		{
		    set[i]= i;
		}
		for( int i= 1; i<= N; ++i )
		{
			scanf( "%s %s", n1, n2 );
			int a= find( n1 ), b= find( n2 );
			if( find( a )!= find( b ) )
			{
			    merge( a, b );
			    edge++;
			} 
			dg[b]++;
		}
		if( edge!= cnt- 1 )
		{
		    printf( "No\n" );
		    continue;
		}
		int shit= 0;
		for( int i= 0; i< cnt; ++i )
		{
		    if( dg[i]== 0 )
		    {
		        shit++;
		    }
		}
		printf( shit== 1? "Yes\n": "No\n" );
	}
}

 
posted @ 2011-07-17 10:18  沐阳  阅读(246)  评论(0编辑  收藏  举报