要点:建有向图,注意双亲性别。
分别对两人dfs,五代以内出现被访问过的结点说明两个人最近的共同祖先如果在五代以内
#include<queue>
#include<iostream>
#include<functional>
#include<vector>
#include<algorithm>
using namespace std;
#define MX 100100
int main(){
int n;
cin >> n;
vector<string> m(MX);
vector<vector<int>> a(MX);
for (int i = 0; i < n;++i){
int u, v, w;
string s;
cin >> u >> s >> v >> w;
m[u] = s;
if(v!=-1){
a[u].push_back(v);
m[v]="M";
}
if(w!=-1){
a[u].push_back(w);
m[w]="F";
}
}
vector<int> vis(MX);
int f = 0;
function<void(int, int)> dfs = [&](int u, int dep)
{
if(dep>=5)
return;
vis[u] = 1;
for(auto x:a[u]){
if(!vis[x])
dfs(x,dep+1);
else
f = 1;
}
};
int k;
cin >> k;
for (int i = 0; i < k;++i){
int u, v;
cin >> u >> v;
f = 0;
fill(vis.begin(), vis.end(), 0);
if(m[u]==m[v])
puts("Never Mind");
else{
dfs(u, 0);
dfs(v, 0);
puts(f ? "No" : "Yes");
}
}
}