LeeBlog

导航

HDU 2094 产生冠军

这个题开始一看是并查集,后来改了很久,怎么改也改不过,只得翻大牛的代码,原来大牛们都是这样写的,左边的为胜利者,有边的为失败者,如果左边的胜利者只有一个没在右边出现过,那么这个就是产生的冠军,否则产生不了

#include<stdio.h>
#include<string.h>
int set[1005],n,f,c,num[1005];
char ch[1005][20];
int search( char str[] )
{
    for( int i = 1; i < c; ++i )
         if( !strcmp( str,ch[i] ) )
             return i;
    strcpy( ch[c],str );
    int len = strlen( str );
    ch[c][len] = 0;
    return c++;
}
int main( )
{
    while( scanf( "%d",&n ),n )
    {
           c = 1;
           f = 1;
           for( int i = 0; i <= 2*n; ++i )
                set[i] = 2;
           for( int i = 1; i <= n; ++i )
           {
                int x,y;
                char str1[20],str2[20];
                scanf( "%s%s",str1,str2 );
                x = search( str1 );
                y = search( str2 );
                set[y] = 0;//标记在右边出现过
                if( set[x] == 2 )//防止在左边出现的已经在右边出现了
                    set[x] = 1;//标记在左边出现过
            }
            int cout = 0;
            for( int i = 1; i < c; ++i )
                 if( set[i] == 1 )
                     ++cout;
            if( cout != 1 )
                f = 0;
            puts( f ? "Yes":"No" );
           }
    return 0;
}

posted on 2011-05-13 11:40  LeeBlog  阅读(690)  评论(0编辑  收藏  举报