L2-016
输入样例:
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
题意:此题要求判断两个人是否可以出五服结婚,可以使用深度搜索,看看两人五服之内祖先是否有交集。先将其中一个人五代之内与他有亲属关系的人全部做标记,在查找另一个人五代之内的亲属,如果亲属中有人带有标记,说明这对情侣不能结婚,反之可以结婚。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll nl=1e5+5;
vector<ll>v[nl];//存每个人的关系
char s[nl];//存性别
ll b[nl];//dfs标记
ll flag;
void dfs(ll x,ll y){//深度搜索亲属关系
if(y>=4){//如果超过五代直接return
return;
}else{
for(ll i=0;i<v[x].size();i++){//i必须在开头定义,不然递归会使程序出错。
if(b[v[x][i]]==0){
b[v[x][i]]=1;
dfs(v[x][i],y+1);
}else{
flag=1;
}
}
}
}
int main(){
ll n;
cin>>n;
ll i,j;
for(i=0;i<n;i++){
ll m,fa,ma;
char sl;
cin>>m>>sl>>fa>>ma;
s[m]=sl;
if(fa!=-1){
s[fa]='M';
v[m].push_back(fa);
}
if(ma!=-1){
s[ma]='F';
v[m].push_back(ma);
}
}
ll k;
cin>>k;
while(k--){
ll c,d;
cin>>c>>d;
flag=0;
memset(b,0,sizeof(b));
if(s[c]==s[d]){
cout<<"Never Mind"<<endl;
}else{
dfs(c,0);
dfs(d,0);
if(flag==1){
cout<<"No"<<endl;
}else{
cout<<"Yes"<<endl;
}
}
}
}