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. 彻底解决小程序无法触发SESSION问题

    一.首先找到第一次发起网络请求的地址,将服务器返回set-cookie当全局变量存储起来 wx.request({ ...... success: function(res) { console.lo ...

  2. 改变JavaScript中函数的内部this指向!

    改变JavaScript中函数的内部this指向! 第一种方法 call call 可以 调用函数 + 改变函数内的this指向! var obj = { name: 'lvhang' } funct ...

  3. 邮件解析 CNAME记录 A记录 NS记录 MX记录

    域名配置 示例发信配置请至域名 service.i-test.cn DNS服务提供商处添加TXT记录,并保持SPF记录正确,否则会无法发信.*1.所有权验证类型 主机记录 主域名 记录值 状态TXT ...

  4. WPF排版布局经验总结(干货)简短不疲倦

    本文不过多讲述wpf的基础布局控件,本文只记录WPF排版的技巧,这是个人的总结,不能符合所有情况,如果有何不对的地方,请评论指正,谢谢. 1.区域划分 在接手一个界面的时候,先纵观全局,将眼见的区域划 ...

  5. PowerBI数据建模时的交叉连接问题

    方案一.在PowerPivot中,将其中一张表复制多份,分别与另一张表做链接. 方案二.在PowerQuery中,做多次合并查询,把所有数据集中在一张表中,方便后面的数据分析. 思考:不仅仅是在Pow ...

  6. 数据分析中常用的Excel函数

    数据分析中excel是一个常见且基础的数据分析工具,要想掌握好它,学会使用其中的常用函数是一个绕不过去的坎.从网上搜集的资料来说,基本上确定了数据分析中Excel的常用函数有以下这六类 数学函数:SU ...

  7. 一:整合shiro

    整合shiro 1.原生的整个 1.1 创建项目 1.2 创建Realm 1.3 配置shiro 2.使用Shiro Starter 2.1 项目创建 2.2 创建Realm 2.3 配置Shiro ...

  8. Html5 部分快捷键

    1:Tab键,快速创建标签 2:ctrl+d,删除光标所在行 3; ctrl+/ 快速添加注释 ctrl+shirt+/ 快速添加多行注释,在js里分别为添加单行注释和多行注释 4; ctrl+alt ...

  9. mysql在8.0版本下修改密码的命令

    ubuntu20.04上边部署了一个新的mysql服务,默认没密码,想要修改密码. 使用如下手段 第一种:ALTER USER 'root'@'localhost' IDENTIFIED BY '密码 ...

  10. Spring Boot配置,读取配置文件

    Spring Boot配置,读取配置文件 一.配置Spring Boot 1.1 服务器配置 1.2 使用其他Web服务器 1.3 配置启动信息 1.4 配置浏览器显示ico 1.5 Yaml语法 1 ...