开始,想的是并查集。
若是并查集的话,则有两个根节点,很复杂。
看了大佬们的博客后,首先对子女和父母建立图(建立的图为有向图),然后用dfs分别对 情侣两个人进行搜索
搜索他们的祖先,记录是否访问,若在搜索过程中,发现祖先已经被访问,则标记flag=1,若不存在,则返回 空。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int n;
char sex[N];
int h[N],ne[N],e[N],idx;
bool st[N];
void add(int a, int b){
e[idx] = b, ne[idx] = h[a],h[a] = idx++;
}
bool flag;
void dfs(int u, int num){
if(num >= 5)//若num > 5则第一个样例错误
return ;
st[u] = true;
for(int i = h[u]; i != -1; i = ne[i]){
int j = e[i];
if(!st[j]){
st[j] = 1;
dfs(j,num+1);
}
else{
flag = 1;
}
}
}
int main(){
cin >> n;
memset(h,-1,sizeof(h));
while(n--){
int id,fa,ma;
char se;
cin >> id >> se >> fa >> ma;
sex[id] = se;
if(fa != -1){
add(id,fa);
sex[fa] = 'M';
}
if(ma != -1){
add(id,ma);
sex[ma] = 'F';
}
}
int m;
cin >> m;
while(m--){
int a, b;
cin >> a >> b;
if(sex[a] == sex[b]){
puts("Never Mind");
continue;
}
flag = 0;
memset(st,0,sizeof(st));
dfs(a,1);
dfs(b,1);
// cout << "flag = " << flag << endl;
if(flag) puts("No");
else puts("Yes");
}
return 0;
}