L2-016 愿天下有情人都是失散多年的兄妹(递归、模拟题)

题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805061769609216
一开始看到这种关系的,立马想到用并查集,但一看还有父亲和母亲,这可咋搞并查集呀,就去看别人的解题报告去了。用广搜的方法没看懂咋搞的,还是模拟大法好呀,一套递归就解决了。

#include<bits/stdc++.h>
using namespace std;
#define MAX 100010                  
struct node
{
	char sex='\0';  //初始化性别 
	int father=-1;  //初始化父亲的身份 
	int mother=-1; //初始化母亲的身份 
};
node nd[MAX];
bool isRelative(int x,int y,int ans)
{
	if(x<0||y<0)  return false;  //如果父母身份不可考就没有继续递归下去的必要了 
	if((nd[x].father>0&&nd[x].father==nd[y].father)||
	(nd[x].mother>0&&nd[x].mother==nd[y].mother))  
	return true;  //首先x和y的父母身份可考证,其次如果他们父亲相同或者母亲相同 
	ans++;
	if(ans>=5)  return false;   //如果超过五代了 
	return isRelative(nd[x].father,nd[y].father,ans)||isRelative(nd[x].father,nd[y].mother,ans)||
	       isRelative(nd[x].mother,nd[y].father,ans)||isRelative(nd[x].mother,nd[y].mother,ans);
	//寻找x的父亲和y父亲,x的父亲和y的母亲,x的母亲和y的父亲,x的母亲和y的母亲是否有血缘关系 
}
int main()
{
    int n,k,id,x,y;
    while(cin>>n)  //人数 
    {
    	for(int i=0;i<n;i++)
    	{
    		cin>>id;  //输入id 
    		cin>>nd[id].sex>>nd[id].father>>nd[id].mother;
    		nd[nd[id].father].sex='M';  //初始化该人父亲的性别 
    		nd[nd[id].mother].sex='F';  //初始化该人母亲的性别 
		} 
		cin>>k;
		while(k--)
		{
			cin>>x>>y;
			if(nd[x].sex==nd[y].sex)  cout<<"Never Mind"<<endl;  //如果同性 
			else
			{
				if(isRelative(x,y,1))  cout<<"No"<<endl;  //如果有五代内的血缘关系 
				else  cout<<"Yes"<<endl;  //如果无五代内的血缘关系 
			}
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39905917/article/details/88428023