【HDOJ 3786】【并查集】 找出直系亲属

  一开始想并查集做,后来发现确定儿子比确定父亲简单,思想类似并查集,查找了几次说明差了几个辈分。



#include "stdio.h"
#include "string.h"
#define Max 50
int son[Max];
int sex[Max];
int bf,bf2;
void join (int a,int b, int c)
{
	son[b]=son[c]=a; 
}
int find(int a,int b,int num)
{
	if(son[a]!=b && son[a]!=0)
		find(son[a],b,num+1);
	if(son[a]==b)
	{
		bf=num;
		return 0;
	}
	else
		return 0;
}
int find2(int a,int b,int num)
{
	if(son[a]!=b && son[a]!=0)
		find2(son[a],b,num+1);
	if(son[a]==b)
	{
		bf2=num;
		return 0;
	}
	else
		return 0;
}
int main(int argc, char const *argv[])
{
	int n,m;
	while(~scanf("%d %d",&n,&m) && (n+m))
	{
		getchar();
		for (int i = 0; i < 50; ++i)
		{
			son[i]=0;
		}
		char a,b,c;
		for (int i = 0; i < n; ++i)
		{
			scanf("%c%c%c",&a,&b,&c);
			getchar();
			sex[b-'A'+1]=1;
			sex[c-'A'+1]=0;
			join(a-'A'+1,b-'A'+1,c-'A'+1);
		}
		// for (int i = 0; i < 50; ++i)
		// {
		// 	if(son[i]!=0)
		// 	printf("%d\n",son[i]);
		// }
		for (int i = 0; i < m; ++i)
		{
			bf=bf2=0;
			scanf("%c%c",&a,&b);
			getchar();
			find(a-'A'+1,b-'A'+1,1);
			find2(b-'A'+1,a-'A'+1,1);
			//printf("%d %d\n",bf,bf2);
			if(bf!=0)
			{
				if(bf==1)
					printf("parent\n");
				else if(bf==2)
					printf("grandparent\n");
				else
				{
					bf-=2;
					for (int i = 0; i < bf; ++i)
					{
						printf("great-");
					}
					printf("grandparent\n");
				}
			}
			else if(bf2!=0)
			{
				{
					if(bf2==1)
						printf("child\n");
					else if(bf2==2)
						printf("grandchild\n");
					else
					{
						bf2-=2;
						for (int i = 0; i < bf2; ++i)
						{
							printf("great-");
						}
						printf("grandchild\n");
					}
				}
			}
			else
				printf("-\n");
		}

	}
	return 0;
}


你可能感兴趣的:(c,并查集,水题)