题目链接: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;
}