您的位置:首页 > 其它

HDU 2094 产生冠军

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



#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: