错误原因:
(1)有父母的情况下才要判断父母是否被标记,否则会出错误,而且要初始化为-1,
因为有五位数是0的情况也要考虑。
(2)没有标记父母的性别。
(3)五层其实只要找四次就好了,是>=5,不是>5.
思路:
每次对x找到所有五服内的人标记,然后再找y的五服内的人标记。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 100100;
int fa[maxn]={-1},mo[maxn]={-1},vis[maxn],gen[maxn],fg;
void dfs(int x,int num)
{
if(num>=5) return ;
if(fa[x]!=-1){ //注意,只有父亲存在的情况下才判断
if(vis[fa[x]]==0){
vis[fa[x]]=1;
dfs(fa[x],num+1);
}
else fg=1;
}
if(mo[x]!=-1){ //注意,只有母亲存在的情况下才判断
if(vis[mo[x]]==0){
vis[mo[x]]=1;
dfs(mo[x],num+1);
}
else fg=1;
}
}
int main(void)
{
int n,m,i,j,x,y,id;
char ch;
fill(fa,fa+maxn,-1);
fill(mo,mo+maxn,-1);
scanf("%d",&n);
while(n--){
scanf("%d %c %d %d",&id,&ch,&x,&y);
gen[id]=(ch=='M'?1:2);
if(x!=-1){
gen[x]=1;fa[id]=x;
}
if(y!=-1){
gen[y]=2;mo[id]=y;
}
}
scanf("%d",&m);
while(m--){
scanf("%d%d",&x,&y);
if(gen[x]==gen[y]) printf("Never Mind\n");
else{
memset(vis,0,sizeof(vis));
vis[x]=vis[y]=1;
fg=0;dfs(x,1);
fg=0;dfs(y,1);
if(fg==1) printf("No\n");
else printf("Yes\n");
}
}
return 0;
}