hdu2094

 
 

分析:    其实,我觉得,这题应该用并查集的,当所有的flag都指向同一个目标的时候,冠军就诞生了,冠军就是目标。    但是。。。 用并查集写出来竟然WA了?    倒是从网上看了看,只要符合没有被击败过的人的人数==1,那么就输出Yes。 按照这个思想写,过了- -I。 But。。。明显不对呀- -I。 反eg:A击败B,B击败C;同时有:D击败E、E击败F、F击败D。 后者是个循环么,根本就不可能判断出A击败了D、E、F么,暴汗- -III,只能说题意不清吧。    不过还是分到并查集类别好了,就假定下面两个代码的前者(用并查集做的)才是对的。                                                              2012-04-13

/*

#include"stdio.h"
#include"string.h"
int main()
{
	int n;
	int i;
	int flag[1111];
	char name[1111][22];
	int k;
	int k1,k2;
	char str1[22],str2[22];
	int d;
	int temp;
	while(scanf("%d",&n),n)
	{
		d=0;
		k=0;
		for(i=0;i<1111;i++)
			flag[i]=i;


		for(i=0;i<n;i++)
		{
			scanf("%s%s",str1,str2);
			for(k1=0;k1<k;k1++)
				if(strcmp(name[k1],str1)==0)
					break;
			if(k1==k)
			{
				strcpy(name[k],str1);
				k++;
			}


			for(k2=0;k2<k;k2++)
				if(strcmp(name[k2],str2)==0)
					break;
			if(k2==k)
			{
				strcpy(name[k],str2);
				k++;
			}


			flag[k2]=flag[k1];
		}


		temp=k;
		while(temp--)
		{
			for(i=0;i<k;i++)
				flag[i]=flag[flag[i]];
		}


		for(i=1;i<k;i++)
			if(flag[i]!=flag[i-1])
			{
				d=1;
				break;
			}


		if(d==1)
			printf("No\n");
		else
			printf("Yes\n");
	}
	return 0;
}

*/


#include"stdio.h"
#include"string.h"
int main()
{
	int flag[1111];
	int name[1111][22];
	int str1[22],str2[22];
	int k1,k2,k;
	int i;
	int n;
	int count;
	while(scanf("%d",&n),n)
	{
		k=0;
		memset(flag,0,sizeof(flag));
		for(i=0;i<n;i++)
		{
			scanf("%s%s",str1,str2);
			for(k1=0;k1<k;k1++)
				if(strcmp(name[k1],str1)==0)
					break;
			if(k1==k)
			{
				strcpy(name[k],str1);
				k++;
			}

			for(k2=0;k2<k;k2++)
				if(strcmp(name[k2],str2)==0)
					break;
			if(k2==k)
			{
				strcpy(name[k],str2);
				k++;
			}

			flag[k2]=1;
		}

		count=0;
		for(i=0;i<k;i++)
			if(flag[i]==0)
				count++;
		if(count==1)
			printf("Yes\n");
		else
			printf("No\n");
	}
	return 0;
}






   

你可能感兴趣的:(hdu2094)