样例输入
24
00001 M 01111 -1
00002 F 02222 03333
00003 M 02222 03333
00004 F 04444 03333
00005 M 04444 05555
00006 F 04444 05555
00007 F 06666 07777
00008 M 06666 07777
00009 M 00001 00002
00010 M 00003 00006
00011 F 00005 00007
00012 F 00008 08888
00013 F 00009 00011
00014 M 00010 09999
00015 M 00010 09999
00016 M 10000 00012
00017 F -1 00012
00018 F 11000 00013
00019 F 11100 00018
00020 F 00015 11110
00021 M 11100 00020
00022 M 00016 -1
00023 M 10012 00017
00024 M 00022 10013
9
00021 00024
00019 00024
00011 00012
00022 00018
00001 00004
00013 00016
00017 00015
00019 00021
00010 00011
样例输出
Never Mind
Yes
Never Mind
No
Yes
No
Yes
No
No
c++代码
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N = 100010;
int n, k;
int p[N];//p[i]表示编号为i的结点是否遍历过
int sex[N];//存储性别
vector<int> v[N];//存图
int flag;//标记两个人的关系是否出五服
//深搜找到一个人五服内的所有长辈,并打上标记
//找另外一个人时如果遇到与刚才那个人相同的祖宗就将flag置为1,表示两人关系未出五服
void dfs(int u, int cnt) {
if (cnt == 5) return;
if (p[u] == 1) {
flag = 1;
return;
}
p[u] = 1;
for (auto t : v[u])
dfs(t, cnt + 1);
}
//判断两个人的关系是否出五服
bool check(int a, int b) {
flag = 0;
memset(p, 0, sizeof p);
dfs(a, 0), dfs(b, 0);
if (flag) return false;
else return true;
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
int id, fa, mo;
char s;
cin >> id >> s;
if (s == 'M') sex[id] = 1;
else sex[id] = 0;
cin >> fa >> mo;
sex[fa] = 1;
sex[mo] = 0;
//只构建子节点到父节点的边,因为只需要找到某个人五服内的祖宗即可
if (fa != -1)v[id].push_back(fa);
if (mo != -1)v[id].push_back(mo);
}
cin >> k;
while (k--) {
int a, b;
cin >> a >> b;
if (sex[a] == sex[b]) cout << "Never Mind" << endl;
else {
if (check(a, b)) cout << "Yes" << endl;
else cout << "No" << endl;
}
}
return 0;
}