版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ccDLlyy/article/details/79808222
题目链接:点击打开链接
思路:反向建树,搜索两个人各自5层以内的祖先,看有没有交集即可。坑点是,一定要保存父母辈的信息,题目的测试用例有判断父母辈的能不能成为情侣......
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <set>
#include <queue>
using namespace std;
#define M 100000
int le[M],rig[M],sex[M];
set<int> ance[3];
void bfs(int x,int loc){
queue<int> q;
q.push(x);
int level = 1,last = x;
while(!q.empty()){
int t = q.front();
q.pop();
ance[loc].insert(t);
if(le[t] != -1) q.push(le[t]);
if(rig[t] != -1) q.push(rig[t]);
if(t == last){
level++;
last = q.back();
if(level == 6) break;
}
}
return;
}
int main(){
int n;
int id,fa,ma;
char se;
memset(le,-1,sizeof(le));
memset(rig,-1,sizeof(rig));
scanf("%d",&n);
for(int i = 0;i < n;i++){
scanf("%d",&id);
getchar();
se = getchar();
scanf("%d%d",&fa,&ma);
sex[id] = (se == 'M'?1:0);
le[id] = fa;
rig[id] = ma;
if(fa != -1){//记录父母性别
sex[fa] = 1;
}
if(ma != -1){
sex[ma] = 0;
}
}
int q,x,y;
scanf("%d",&q);
while(q--){
scanf("%d%d",&x,&y);
if(sex[x] == sex[y]){
printf("Never Mind\n");
continue;
}
ance[0].clear();
ance[1].clear();
ance[2].clear();
bfs(x,0);
bfs(y,1);
set_intersection(ance[0].begin(),ance[0].end(),ance[1].begin(),ance[1].end(),inserter(ance[2],ance[2].begin()));
puts((int)ance[2].size()?"No":"Yes");
}
return 0;
}