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

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

输入格式:
输入第一行给出一个正整数N(2 ≤ N ≤10000),随后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进行搜索,构成一个树,本人相当于根节点,向下就行搜索其父母,对出现的进行标记即可:
bsf AC代码:(注意代码中标记的坑)

#include <bits/stdc++.h>
using namespace std;
vector<int> p[100000];
char sex[100000];int main(){int n,k,a,c,d,x,y;char b;cin >> n; for(int i=0; i<n; i++){cin>>a>>b>>c>>d;p[a].push_back(c);p[a].push_back(d);sex[a]=b;if(c!=-1) sex[c]='M';  //坑点,父母的性别要加上,不然判断不了父母之间的结婚情况; if(d!=-1) sex[d]='F';}cin>>k;while(k--){cin>>x>>y;if(sex[x]==sex[y]) cout<<"Never Mind"<<endl;else{int depth=0,flag=0,d[100000]={},vis[100000]={};queue<int> f,m;    f.push(x);d[x]=1;while(!f.empty()){int ff=f.front();if(d[ff]==5) break;vis[ff]=1;f.pop();for(int i=0; i<p[ff].size(); i++){if(p[ff][i]!=-1){vis[p[ff][i]]=1;f.push(p[ff][i]);  d[p[ff][i]] = d[ff]+1;} }}memset(d,0,sizeof(d));m.push(y);d[y]=1;while(!m.empty()){int mm=m.front();if(d[mm]==5) break;m.pop();flag=0;for(int i=0; i<p[mm].size(); i++){if(p[mm][i]!=-1&&vis[p[mm][i]]) flag++;else if(p[mm][i]!=-1) m.push(p[mm][i]);}if(flag>0){cout<<"No"<<endl;break;}}           if(!flag) cout<<"Yes"<<endl;} }return 0;
}

通过后,感觉自己写的代码不是很好,上网搜了一下,发现用dfs的方法也很方便,下面给出dfs AC代码:

#include <bits/stdc++.h>
using namespace std;vector<int> vec[100000];//存关系图
bool vis[100000];//标记五服以内的亲属
char sex[100000];//记录性别
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); }else flag=1;//五服之内出现一样的人 }
}
int main()
{int T;cin>>T;while(T--){int t,fa,ma;char ch;cin>>t>>ch>>fa>>ma;sex[t]=ch;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;cin>>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;
}

贴出dfs参考博客:https://blog.csdn.net/sm20170867238/article/details/82118718
欢迎大家进行批评改正!!!

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

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

    添加链接描述 #include<bits/stdc++.h> using namespace std; const int N=1e5+5; int sex[N],vis[N]; vect ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. PE文件和COFF文件格式分析--MS-DOS 2.0兼容Exe文件段
  2. 人工智能可落地项目总结
  3. python适合多大的人学-学Python编程孩子几岁最合适?
  4. git push origin master和git push有什么区别?
  5. computed怎么使用_Vuex 基本使用
  6. 鸿蒙日程管理若离,2020华为HDC日程确定,鸿蒙、HMS以及EMUI 11成最关注点
  7. 计算机网络中的语法 语义 时序的概念,网络iso协议及语义语法时序详解
  8. Hibernate初步
  9. android中MVC,MVP和MVVM三种模式详解析
  10. onenote快捷键_onenote快捷键的高效用法
  11. Android 的蓝牙简介
  12. SDUT1500Message Flood(字典树)
  13. c语言各定义长度,关于C语言各个数据类型长度
  14. 【IT运维】自动化运维是什么意思?有什么作用?
  15. Ubuntu下eclipse无法识别手机驱动
  16. java单循环赛制程序_单循环比赛的固定轮转编排法与贝格尔编排法
  17. python将电视剧按收视率进行排序_2019电视剧收视率排行榜
  18. 计算机网络验证性实验-棋歌教学网
  19. 没有什么软文是营销圈拯救不了的?
  20. 群晖QuickConnect与DDNS之间有何区别?

热门文章

  1. 【网络】计算机网络常见面试题 - 前端面试必备 - 吐血整理
  2. DBA高手楼方鑫:从ebay到支付宝
  3. QT 计算两个日期时间差?(时间转时间戳)
  4. 内蒙古大学孙涛计算机学院,孙涛(博士)
  5. 猴子爬山编程java_小猴子摘桃子問題 -- JAVA 算法學習
  6. python的:0 if x == y else 1 if x y else -1
  7. java-php-python-足球赛会管理系统计算机毕业设计
  8. 深入了解junit及Statement源码 ,了解整体执行流程
  9. 解析智能硬件“独角兽”们的发展态势!附2017年全球硬件领域“独角兽”企业榜单
  10. MDT 2013 从入门到精通之DHCP环境准备