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

时间限制
200 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard

作者
陈越

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

输入格式:

输入第一行给出一个正整数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

这题是基础bfs,不过题目有点坑。

解题思路:因为该题说明不会出现乱伦,且只能同辈结婚。所以我们可以直接设个vis数组记录点是否重复出现就行了,如果重复出现,则肯定是近亲或者同性了。

1.注意初始化每个节点的父母,不然搜到一个点没有给出其父母,继续搜索下去,会得到初始化的值0,若有两个以上没有父母,则0会重复出现,导致误判。
2.父母也有可能同性。

这两点样例中都有体现,基本样例过了,该题就过了。

 1 #include <cstdio>
2 #include <cstring>
3 #include <string>
4 #include <iostream>
5 #include <algorithm>
6 #include <vector>
7 #include <map>
8 #include <queue>
9 #include <map>
10 #include <cmath>
11 using namespace std;
12 const int inf = 0x3f3f3f3f;
13 typedef long long ll;
14 const int maxn = 1e5+10;
15 struct nod
16 {
17 int sex;
18 int fid;
19 int mid;
20 };
21 int vis[maxn];//记录是否重复出现
22 int cnt[maxn];//判断搜到了第几代
23 map<int,nod>mp;//map存id
24 void bfs(int u,int v)
25 {
26 memset(vis,0,sizeof(vis));
27 memset(cnt,0,sizeof(cnt));
28 queue<int>q;
29 q.push(u);
30 q.push(v);
31 while(!q.empty())
32 {
33 int x=q.front();q.pop();
34 if(vis[x])
35 {
36 // cout<<x<<endl;
37 puts("No");
38 return ;
39 }
40 vis[x]=1;
41 if(cnt[x]<4)
42 {
43 u=mp[x].fid;
44 v=mp[x].mid;
45 if(u!=-1)
46 {
47 q.push(u);
48 cnt[u]=cnt[x]+1;
49 }
50 if(v!=-1)
51 {
52 q.push(v);
53 cnt[v]=cnt[x]+1;
54 }
55 }
56
57 }
58 puts("Yes");
59 }
60 int main()
61 {
62
63 int n;
64 scanf("%d",&n);
65 int a,c,d;
66 char b;
67 for(int i=0;i<1e5+10;++i) //父母初始化
68 mp[i].fid=-1,mp[i].mid=-1;
69 for(int i=0;i<n;++i)
70 {
71 scanf("%d %c %d %d",&a,&b,&c,&d);
72 if(b=='M') mp[a].sex=1;
73 else mp[a].sex=0;
74 mp[a].fid=c;
75 mp[c].sex=1; //存储其父母的性别
76 mp[a].mid=d;
77 mp[d].sex=0;
78 }
79 int k;
80 scanf("%d",&k);
81 int u,v;
82 for(int i=0;i<k;++i)
83 {
84 scanf("%d%d",&u,&v);
85 if(mp[u].sex==mp[v].sex) puts("Never Mind");
86 else bfs(u,v);
87 }
88 return 0;
89 }

反思:这道题单拉出来写,会觉得很简单,因为思路很清晰,cccc的题大多是这样。但是比赛的时候就没写出来,写出的代码又臭又长。赛后经过思考,我认为是因为比赛的时候有大量的题,而且前面的题都是手速题,很容易为了赶时间 而陷入 靠直觉狂敲不思考的状态。但是后面的搜索与图论题,动动脑筋会让代码简洁许多,想出完整的思路再敲才是高效的方法。

因此在以后比赛中要学会暂停,时间再紧张,也要休息。

卡题超过半个小时,就应该赶紧换题。


PAT L2-016. 愿天下有情人都是失散多年的兄妹 (BFS)的更多相关文章

  1. 愿天下有情人都是失散多年的兄妹(bfs)

    L2-016. 愿天下有情人都是失散多年的兄妹 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 呵呵.大家都知道五服以内不得通婚 ...

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

    L2-016. 愿天下有情人都是失散多年的兄妹 参考博客 #include<iostream> #include<cstdio> #include<cstring> ...

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

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

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

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805061769609216 分析:一开始以为是并查集..... ...

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

    https://pintia.cn/problem-sets/994805046380707840/problems/994805061769609216 呵呵.大家都知道五服以内不得通婚,即两个人最 ...

  6. PAT L2-016 愿天下有情人都是失散多年的兄妹(深搜)

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

  7. PAT 天梯赛练习集 L2-016. 愿天下有情人都是失散多年的兄妹

    题目链接:https://www.patest.cn/contests/gplt/L2-016 呵呵.大家都知道五服以内不得通婚,即两个人最近的共同祖先如果在五代以内(即本人.父母.祖父母.曾祖父母. ...

  8. PAT 天梯赛 L2-016. 愿天下有情人都是失散多年的兄妹 【BFS】

    题目链接 https://www.patest.cn/contests/gplt/L2-016 思路 用BFS 每层 遍历当代 并且查找当代是否有重复 有重复就跳出 然后 POP 并且将他们的下一代 ...

  9. 【PTA 天梯赛】L2-016. 愿天下有情人都是失散多年的兄妹(深搜)

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

随机推荐

  1. 【JeecgBoot】关于 jeecg-boot 的项目理解、使用心得和改进建议

    工欲善其事,必先利其器. 脚手架选型 一年前,我接到为团队落地一个快速开发脚手架的任务. 在月底这节骨眼上,时间紧,任务急,有想自己撸一个脚手架的人都赶紧把这想法收起来吧!这劳民又伤身的事咱肯定是不能 ...

  2. linux设备文件

    一.前言 在调用了alloc_chrdev_region函数或register_chrdev_region函数之后可以在/proc/devices中看到该设备的主设备号,比如我注册的hello模块的主 ...

  3. CSS奇思妙想 -- 使用 CSS 创造艺术

    本文属于 CSS 绘图技巧其中一篇.之前有过一篇:在 CSS 中使用三角函数绘制曲线图形及展示动画 想写一篇关于 CSS 创造艺术的文章已久,本文主要介绍如何借助 CSS-doodle ,利用 CSS ...

  4. 计算机网络安全 —— 非对称加密算法 RSA 和数字签名(二)

    一.非对称加密算法基本概念 在对称密钥系统中,两个参与者要共享同一个秘密密钥.但怎样才能做到这一点呢?一种是事先约定,另一种是用信使来传送.在高度自动化的大型计算机网络中,用信使来传送密钥显然是不合适 ...

  5. 前端面试准备笔记之JavaScript(01)

    1.1 typeof 能判断哪些类型? typeof可以识别所有的值类型 typeof可以识别函数 //function typeof可以判断是否是引用类型(不可以再细分) //object 1.2 ...

  6. ryu—流量监视

    1. 代码解析 ryu/app/simple_monitor_13.py: from operator import attrgetter from ryu.app import simple_swi ...

  7. missing required library sqlite.dll最终解决办法

    missing required library sqlite.dll最终解决办法 昨天电脑还是好的,今天早晨打开navicat连接Mysql无缘无故报错"missing required ...

  8. JAVA不可不知的强软弱虚四种引用

    一个变量指向new对象,就是引用,在java中有四种引用,分别是强软弱虚,常见的Object o = new Object(),就是强引用,垃圾回收的时候,强引用不会被回收.   公用类: publi ...

  9. 选出ip记录表最近的10行数据

    w select * from wip where id>(select (select max(id)from wip)-10) ;

  10. makefile自动生成学习

    https://www.cnblogs.com/jrglinux/p/6964169.html 关键是如何写Makefile.am  其他的交给 自动工具完成 添加一个 很好的博客 学习下 https ...