2
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
这个题一做做一下午。就是进行两遍dfs,第一遍把第一个人的五服亲属标记,第二遍看看第二个人的五服亲属是否已被标记过。若被标记过则没出五服。
需要注意的是:每次输入的时候都需要把父亲和母亲的性别更新一下,因为,当一个人的父亲或者母亲的信息没有在下面的数据给出,那么这个人的父亲和母亲的性别就会没有被保存。如果测试数据中要求你回答这个人父亲或者他的母亲是否可以和别人成为情侣时,就会无法判断这两个人是否是同性还是异性,那么就会有错。参考cp0328
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int maxn = 1e5 + 10;
int n,k;
struct node
{
int id,fa = -1,ma = -1;
char g;
}a[maxn];
int vis[maxn];
bool sign;
void dfs(int x,int d)
{
// printf("%d %d %d\n",x,vis[x],d);
if(vis[x] > 1) sign = true;
if(d > 3 || sign) return;
int fx = a[x].fa;
int mx = a[x].ma;
// printf("%d %d\n",fx,mx);
if(fx != -1)
{
vis[fx]++;
dfs(fx,d + 1);
}
if(sign) return;
if(mx != -1)
{
vis[mx]++;
dfs(mx,d + 1);
}
}
int main()
{
int x,fx,mx,y;
char gx;
cin>>n;
for(int i = 0;i < n;i++)
{
cin>>x>>gx;
getchar();
cin>>fx>>mx;
a[x].id = x;
a[x].g = gx;
a[x].fa = fx;
a[x].ma = mx;
a[fx].g = 'M';
a[mx].g = 'F';
}
cin>>k;
for(int i = 0;i < k;i++)
{
cin>>x>>y;
if(a[x].g == a[y].g) printf("Never Mind\n");
else
{
sign = false;
memset(vis,0,sizeof(vis));
dfs(x,0);
dfs(y,0);
// cout<<sign<<endl;
if(!sign) printf("Yes\n");
else printf("No\n");
}
}
return 0;
}