C4top-愿天下有情人都是失散多年的兄妹(DFS)

来源:互联网 发布:按键精灵mac版怎么用 编辑:程序博客网 时间:2024/05/03 10:56
愿天下有情人都是失散多年的兄妹   

呵呵。大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人、父母、祖父母、曾祖父母、高祖父母)则不可通婚。本题就请你帮助一对有情人判断一下,他们究竟是否可以成婚?

输入格式:

输入第一行给出一个正整数N(2 \le N \le 10^4104),随后N行,每行按以下格式给出一个人的信息:

本人ID 性别 父亲ID 母亲ID

其中ID是5位数字,每人不同;性别M代表男性、F代表女性。如果某人的父亲或母亲已经不可考,则相应的ID位置上标记为-1

接下来给出一个正整数K,随后K行,每行给出一对有情人的ID,其间以空格分隔。

注意:题目保证两个人是同辈,每人只有一个性别,并且血缘关系网中没有乱伦或隔辈成婚的情况。

输出格式:

对每一对有情人,判断他们的关系是否可以通婚:如果两人是同性,输出Never Mind;如果是异性并且关系出了五服,输出Yes;如果异性关系未出五服,输出No

输入样例:

2400001 M 01111 -100002 F 02222 0333300003 M 02222 0333300004 F 04444 0333300005 M 04444 0555500006 F 04444 0555500007 F 06666 0777700008 M 06666 0777700009 M 00001 0000200010 M 00003 0000600011 F 00005 0000700012 F 00008 0888800013 F 00009 0001100014 M 00010 0999900015 M 00010 0999900016 M 10000 0001200017 F -1 0001200018 F 11000 0001300019 F 11100 0001800020 F 00015 1111000021 M 11100 0002000022 M 00016 -100023 M 10012 0001700024 M 00022 10013900021 0002400019 0002400011 0001200022 0001800001 0000400013 0001600017 0001500019 0002100010 00011

输出样例:

Never MindYesNever MindNoYesNoYesNoNo
 
  • 时间限制:200ms
  • 内存限制:64MB
  • 代码长度限制:16kB
  • 判题程序:系统默认
  • 作者:陈越
  • 单位:浙江大学

题目判定

解题思路
用结构体保存个人信息,初始化父母的ID均为-1,输入时必须手动赋值确定父母性别。
DFS搜索两人的信息,bool DFS(int x,int y,int num)//两人ID,当前搜索到了几代。
分四种情况考虑:
①异性并且关系出了五服;
②当前的两人ID未能确定且未出五服;
③当前两人同母或同父且未出五服;
④搜索当前两人的双母、双父、母父、父母。

解题程序
#include<cstdio>#include<cstring>#include<cmath>#include<queue>#include<iomanip>#include<cstdlib>#include<iostream>#include<algorithm>using namespace std;#define MAXN 100010#define INF 0x3f3f3f3fstruct Node{    char sex;//性别    int fa;//父亲ID    int mo;//母亲ID} a[MAXN];//个人信息bool DFS(int x,int y,int num)//两人ID,当前搜索到了几代{    if(num>=4) return true;//异性并且关系出了五服    if(x==-1||y==-1) return true;//ID未能确定    if((a[x].mo!=-1&&a[x].mo==a[y].mo)||(a[x].fa!=-1&&a[x].fa==a[y].fa)) return false;//同母或同父    return (DFS(a[x].mo,a[y].mo,num+1) && DFS(a[x].fa,a[y].fa,num+1)&&DFS(a[x].mo,a[y].fa,num+1)&&DFS(a[x].fa,a[y].mo,num+1));}int main(){#ifdef ONLINE_JUDGE#else    freopen("G:/cbx/read.txt","r",stdin);//freopen("G:/cbx/out.txt","w",stdout);#endif    ios::sync_with_stdio(false);    cin.tie(0);    int n;    cin>>n;    for(int i=0; i<MAXN; i++)        a[i].fa=a[i].mo=-1;    for(int i=0; i<n; i++)    {        int x;        cin>>x;        cin>>a[x].sex>>a[x].fa>>a[x].mo;        if(a[x].fa!=-1) a[a[x].fa].sex='M';//必须手动赋值确定父母性别        if(a[x].mo!=-1) a[a[x].mo].sex='F';    }    int q;    cin>>q;    for(int i=0; i<q; i++)//查询两人的关系    {        int x,y;        cin>>x>>y;        if(a[x].sex==a[y].sex) cout<<"Never Mind"<<endl;//同性        else        {            if(DFS(x,y,0)) cout<<"Yes"<<endl;//异性并且关系出了五服            else cout<<"No"<<endl;//异性关系未出五服        }    }    return 0;}


0 0