L2-016 愿天下有情人都是失散多年的兄妹(25 分)
呵呵。大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人、父母、祖父母、曾祖父母、高祖父母)则不可通婚。本题就请你帮助一对有情人判断一下,他们究竟是否可以成婚?
输入格式:
输入第一行给出一个正整数N(2 <= N <= 104),随后N行,每行按以下格式给出一个人的信息:
本人ID 性别 父亲ID 母亲ID
其中ID是5位数字,每人不同;性别M代表男性、F代表女性。如果某人的父亲或母亲已经不可考,则相应的ID位置上标记为-1。
接下来给出一个正整数K,随后K行,每行给出一对有情人的ID,其间以空格分隔。
注意:题目保证两个人是同辈,每人只有一个性别,并且血缘关系网中没有乱伦或隔辈成婚的情况。
输出格式:
对每一对有情人,判断他们的关系是否可以通婚:如果两人是同性,输出“Never Mind”;如果是异性并且关系出了五服,输出“Yes”;如果异性关系未出五服,输出“No”。
输入样例:
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

这题要我们在给出的关系图中查找一对异性情侣在五服以内是否有近亲,同性直接输出Never Mind,无需其他处理。
需要注意的是,父母在这也属于情侣,要标记他们的性别,还有父母会离异再婚,比如测试数据中3和4就是同母异父的关系。标记性别需要注意一下,如果习惯用0-1标记男女,初始化不能为0,因为后台测试数据中出现关系图中没出现过的人,这样的人是没有性别的,初始化为0就默认了他的性别。我习惯用bool类型false表示男,true表示女,所以照成下面的悲剧。(最后一个测试数据关系图外的人)。

对于查找异性情侣是否存在近亲关系,我的思路很简单,先将其中一个人五代之内与他有亲属关系的人全部做标记,在查找另一个人五代之内的亲属,如果亲属中有人带有标记,说明这对情侣不能结婚,反之可以结婚。
方法:用二维数组或vector容器存关系图,然后对两个人深搜或广搜找出五服里所有亲属。
以第七对情侣为例:


在上面这两颗关系树中没有出现相同的亲属,所以他们没有近亲关系。输出Yes。

再以不能结婚的最后一组情侣为例:

在第三层中出现已经标记过的人,说明这两个人是近亲关系,输出No。

AC代码:

#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
const int Inf=1e5+5;
vector<int> vec[Inf];//存关系图
bool vis[Inf];//标记五服以内的亲属
char sex[Inf];//记录性别
bool flag;//标记情侣是否为近亲
void Dfs(int x,int num)//num表示第几代,从0开始
{if(num>=4)//超过五代直接退出 return;for(int i=0;i<vec[x].size();i++){if(!vis[vec[x][i]]) {vis[vec[x][i]]=1;//标记出现的人 Dfs(vec[x][i],num+1); }elseflag=1;//五服之内出现一样的人 }
}
int main()
{int T;cin>>T;while(T--){int t,fa,ma;char ch;scanf("%d ",&t);sex[t]=getchar();scanf(" %d %d",&fa,&ma);if(fa!=-1) //-1不用保存,避免数据处理不当导致数组越界 {vec[t].push_back(fa);//保存双亲 sex[fa]='M';//记录父亲性别 }if(ma!=-1){vec[t].push_back(ma);sex[ma]='F';}}cin>>T;while(T--){int x,y;scanf("%d %d",&x,&y);if(sex[x]==sex[y])//同性 cout<<"Never Mind"<<endl;else{memset(vis,0,sizeof(vis)); vis[x]=1;  vis[y]=1;flag=0;Dfs(x,0);Dfs(y,0);if(flag)//被标记过说明这两人为近亲 cout<<"No"<<endl;elsecout<<"Yes"<<endl;}}return 0;
}

L2-016 愿天下有情人都是失散多年的兄妹(25 分)相关推荐

  1. 7-57 愿天下有情人都是失散多年的兄妹 (25 分)(深搜)

    7-57 愿天下有情人都是失散多年的兄妹 (25 分) 呵呵.大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人.父母.祖父母.曾祖父母.高祖父母)则不可通婚.本题就请你帮助一对 ...

  2. 【CCCC】L2-016 愿天下有情人都是失散多年的兄妹 (25分),,搜索公共祖先

    problem L2-016 愿天下有情人都是失散多年的兄妹 (25分) 呵呵.大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人.父母.祖父母.曾祖父母.高祖父母)则不可通婚. ...

  3. 7-13 愿天下有情人都是失散多年的兄妹 (25 分)

    7-13 愿天下有情人都是失散多年的兄妹 (25 分) 呵呵.大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人.父母.祖父母.曾祖父母.高祖父母)则不可通婚.本题就请你帮助一对 ...

  4. L2-016 愿天下有情人都是失散多年的兄妹 (25 分)(C语言)(并查集)(dfs)(测试点坑)

    题目 L2-016 愿天下有情人都是失散多年的兄妹 (25 分) 呵呵.大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人.父母.祖父母.曾祖父母.高祖父母)则不可通婚.本题就请 ...

  5. 天梯赛 L2-016 愿天下有情人都是失散多年的兄妹 (25 分)[测试点1 3 4][未填坑]

    L2-016 愿天下有情人都是失散多年的兄妹 (25 分) 思路: 在录入的时候用map和结构体储存性别,父母ID, 判断的时候先判断性别,再用dfs搜索第一个人五服之内的关系,并将关系任务ID存储到 ...

  6. 天梯赛:L2-016 愿天下有情人都是失散多年的兄妹 (25 分)

    题目详情 - L2-016 愿天下有情人都是失散多年的兄妹 (25 分) (pintia.cn) 题解:对于每个给出的编号进行层序遍历,把遍历到的元素存进集合里.如果两个集合存在交集,就代表它们存在公 ...

  7. PTA:7-106 愿天下有情人都是失散多年的兄妹 (25分)(bfs,dfs)

    7-106 愿天下有情人都是失散多年的兄妹 (25分) 呵呵.大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人.父母.祖父母.曾祖父母.高祖父母)则不可通婚.本题就请你帮助一对 ...

  8. 愿天下有情人都是失散多年的兄妹 (25分)

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

  9. 7-4 愿天下有情人都是失散多年的兄妹 (25 分)

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

  10. 7-2 愿天下有情人都是失散多年的兄妹 (25 分)

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

最新文章

  1. TIME_WAIT状态及存在原因
  2. python编程从入门到精通 叶维忠 pdf-零基础如何学习python?十本精品python书籍推荐...
  3. python软件怎么用-python软件怎么用
  4. Delphi XE 10.2.3使用CEF4Delphi取网页元素时碰到nbsp;变问号?的处理
  5. OpenCV图像增强(一)——多尺度视网膜增强
  6. 网络编程+Python
  7. 100万并发连接服务器笔记之Erlang完成1M并发连接目标
  8. macos ntfs插件_NTFS for Mac 助手 - Mac读写NTFS磁盘工具
  9. CFA难度:特许金融分析师CFA难考吗?
  10. 基于深度学习的单目2D/3D姿态估计综述(2021)
  11. matlab中画花瓣,matlab花瓣图的编程原理是什么,向天下大侠求解!!!!给力的? 爱问知识人...
  12. 国际品牌会员俱乐部VTN甄选全球好物 把握消费升级趋势 引领品牌高质量发展
  13. easyui分页查询为什么会有下拉框_Easyui 添加分页组件_EasyUI 教程
  14. 用c语言程序判断谁是小偷
  15. PostgreSQL的学习心得和知识总结(五十三)|语法级自上而下完美实现MySQL数据库的 insert set 的实现方案
  16. js 跳转到指定位置 高德地图_JS控制div跳转到指定的位置的几种解决方案总结
  17. ASP.NET Core 3.x 学习笔记(7)——Blazor
  18. 实验六:分析Linux内核创建一个新进程的过程
  19. 三七互娱php笔试题,三七互娱笔试
  20. [md] 如何做一个心状枕头

热门文章

  1. JZOJ4722. 跳楼机
  2. 西瓜书读书笔记(一)
  3. http web服务器
  4. 宁宛 机器人_全文阅读 .001 忠犬机器人
  5. 给定一个数组,求数组的最大连续子数组,使得该子数组的和最大
  6. IFrame里面的子页面html内容变化时,怎么动态改变IFrame的高度
  7. 搭建外网能访问的web服务器
  8. ARM架构与X86架构
  9. 解决ie浏览器兼容ES6语法问题
  10. 关于获取3DS MAX中的蒙皮数据 3DSMAX C++API的应用