题目链接: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;
}