原题

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

输入格式:

输入第一行给出一个正整数N(2 ≤ N ≤10^4​​ ),随后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

思路:

这道题有一定的难度,首先题意要能够理解。题目中说了五代之内不得通婚,从这一点入手,可以定义一个变量flag来进行判断:这对情侣的祖辈是否重复访问过,若重复访问过,则可以得出是近亲。在这里一定要记得要在五代之内进行判断,超出了就要退出循环。

其余的就可以通过dfs来进行判断,这里还有一个点要注意,输入的父母亲要存放他们的性别,要不然之后无法判断性别了。而且如果是-1的话,不用进行存入,这样保存到数组中会出错(数组下标不能为-1)

说到这里,这道题应该挺清楚的了,剩余的可以看代码的注解进行理解。有不懂的地方欢迎到评论区进行交流O(∩_∩)O~

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
char sex[maxn]; //记录性别
bool vis[maxn]; //标记是否访问
bool flag;              //标记是否近亲
vector<int>vec[maxn]; //存关系图void dfs(int x, int 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);}else {flag = 1;  //是近亲return;}}
}
int main()
{int n;cin >> n;char sexx;int num, dad, mom;while (n--){scanf("%d %c %d %d", &num, &sexx, &dad, &mom);//cin >> num >> sexx >> dad >> mom;sex[num] = sexx;if (dad != -1){vec[num].push_back(dad);sex[dad] = 'M';}if (mom != -1){vec[num].push_back(mom);sex[mom] = 'F';}}cin >> n;int person1, person2;while (n--){scanf("%d %d", &person1, &person2);if (sex[person1] == sex[person2])cout << "Never Mind" << endl;else{fill(vis, vis + maxn, 0);flag = 0;vis[person1] = vis[person2] = 1;dfs(person1, 0);dfs(person2, 0);if (flag)cout << "No" << endl;elsecout << "Yes" << endl;}}return 0;
}

PAT【L2-016】愿天下有情人都是失散多年的兄妹(dfs超详解)相关推荐

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

    L2-016 愿天下有情人都是失散多年的兄妹 (25 分) 因为人的id都是整数,所以这道题可以离散化,也可以不离散化,在此给出两种方式的代码: 非离散化代码: #include<bits/st ...

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

    题目链接:PTA | 程序设计类实验辅助教学平台 输入样例: 24 00001 M 01111 -1 00002 F 02222 03333 00003 M 02222 03333 00004 F 0 ...

  3. 【PTA-训练day6】L2-016 愿天下有情人都是失散多年的兄妹+ L1-011 帅到没朋友

    L2-016 愿天下有情人都是失散多年的兄妹 - dfs PTA | 程序设计类实验辅助教学平台 思路: 先记录每个人的父母 然后k组查询 分别用dfs搜索两个人的族谱 五服之内出现的人都标记 如果搜 ...

  4. PAT L2-016. 愿天下有情人都是失散多年的兄妹

    L2-016. 愿天下有情人都是失散多年的兄妹 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 完全转载:https://blo ...

  5. bfs( L2-016 愿天下有情人都是失散多年的兄妹 (25 分))

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. Directx11教程(42) 纹理映射(12)-简单的bump mapping
  2. 【android】安卓平台版本和API版本的对应关系
  3. 1803无法升级到2004_微软向win10 1803以后版本推送新的Edge浏览器更新 安装后不再支持直接卸载...
  4. Android分辨率比例为1,修改android5.1系统分辨率
  5. python 释放链表节点_四种常见链表的实现及时间复杂度分析(Python3版)
  6. 50-20-200-配置-checkpoint配置
  7. Presto架构及原理、安装及部署
  8. 用户密码以BCrypt加密的方式来防范被破解
  9. JSP项目打开默认主页
  10. 暂时初步完成了搜索引擎的基本功能
  11. java宿舍信息管理系统_Java宿舍管理系统
  12. 项目(1)——文件压缩
  13. 架构师须知概念:POJO、PO、DTO、DAO、BO、VO
  14. 计算机的音量找不到了,电脑音量调节小喇叭不见了修复方法
  15. halcon测试篇:求两条线之间的交点
  16. 主内存和工作内存是什么?
  17. 23年哪些企业不能申报高企
  18. 晚安西南-----液气分离器
  19. SQL Server基础操作(此随笔仅作为本人学习进度记录七 !--函数)
  20. 保理业务系统-产品介绍

热门文章

  1. Python怎么去抓取公众号的文章?Python爬虫爬取微信公众号方法
  2. java面试题全覆盖
  3. Android类似微信图片查看下拉缩放并移动
  4. 单词快速记忆 day15
  5. MVD-深入解析视图与委托的一点小节
  6. 用C++ Builder编程监控打印机队列状态
  7. 高中python教程标准_高中应该怎样自学Python?
  8. AD域集成方案之中国计算机报原稿
  9. 考研政治 | 自用笔记记录
  10. open cv 不同大小图片,小图片替换到大图片中具体位置