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

题目链接:PTA | 程序设计类实验辅助教学平台

输入样例:

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

分析:这道题需要定义一个结构体,里面存有本人的id以及父母的id,然后直接进行搜索就行了。在分析询问时我们首先判断一下两个人的性别是否相同,如果性别相同就直接输出“Never Mind”,否则就判断两个人在五代之内是否有共同的亲人,搜索的话就是一个普通的dfs,里面带有一个变量标识当前搜索的是第几代的亲人。但是这样写完之后只能得17分,这里就是有一个坑点,就是父母可以离异,也就是说,有可能结婚的两个人都是有孩子的,而恰巧没有给出父母的介绍,就是说假如我们有一个输入00025 M 00164 15665,但是没有给出他的父亲00164的介绍以及15665的介绍,这个时候我们存储的信息中就没有这两个标号的信息,包括性别,而在进行询问时,如果恰巧访问到两个没有记录的人,由于没有性别设置,所以他们的值都为空值,所以就默认相等,所以我们需要在输入时先对性别作一下记录,也就是通过孩子的父亲还是母亲确定性别,至于其父亲或母亲的长辈我们就不需要再进行记录,只要将0等同于-1即可。

下面是代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<set>
#include<vector>
#include<map>
#include<queue>
#include<cmath>
using namespace std;
const int N=1e6+10;
struct node{
	int f,m;
	char sex[2];
}p[N];
bool dfs(int a,int b,int cnt)
{
	if(!a||!b) return false;
	if(cnt>5) return false;//5代以内 
	if(a==b) return true;
	bool t=false;
	if(p[a].f!=-1)
	{
		if(p[b].f!=-1)
			t|=dfs(p[a].f,p[b].f,cnt+1);
		if(p[b].m!=-1)
			t|=dfs(p[a].f,p[b].m,cnt+1);
	}
	if(p[a].m!=-1)
	{
		if(p[b].f!=-1)
			t|=dfs(p[a].m,p[b].f,cnt+1);
		if(p[b].m!=-1)
			t|=dfs(p[a].m,p[b].m,cnt+1);
	}
	return t;
}
int main()
{
	int n,t;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&t);
		scanf("%s%d%d",p[t].sex,&p[t].f,&p[t].m);
		p[p[t].f].sex[0]='M';//有可能题目中没有给出父母的信息,所以需要提前把父母的性别做好标记 
		p[p[t].m].sex[0]='F';
	}
	int q,a,b;
	cin>>q;
	while(q--)
	{
		scanf("%d%d",&a,&b);
		if(p[a].sex[0]==p[b].sex[0])
			printf("Never Mind");
		else
		{
			if(!dfs(a,b,1)) printf("Yes");
			else printf("No");
		}
		if(q) puts("");
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值