深搜dfs--L2-016 愿天下有情人都是失散多年的兄妹 (25 分)

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;
			}
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值