题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805061769609216

题意:两个异性的人五服之内不得通婚,给出n个人的信息,包括id、性别、父母id(父母不可考的为-1),给出k组询问,若两个人同性,输出"Never Mind“,异性可通婚输出Yes,异性不可通婚输出No。

思路:看完题就感觉是个并查集的题,然后一直在往并查集这个方向想,可是怎么也想不到怎么处理五代之内的祖先的问题,无奈去查了下,看到别人的思路是dfs,醍醐灌顶,对啊,数据这么小,直接搜索两个人的五代之内的祖先有没有交集不就行了,唉,还是做的题目太少了,容易局限于一个角度。

  好了,回归题目,这个题目有个很坑的地方,输入的询问可能会问到没有出现的id,这种情况就不会有近亲的可能,但不知道其性别,所以其性别可M可F。因为id为5位,我们1e5+5大小的结构体数组就可存所有人的信息了,结构体中包含性别,父母id,因为上面提到其性别可能出现3种情况,因此用0表示可M可F,用1表示M,用2表示F;父母id初始化为-1,输入个人信息的时候要注意要同时初始化其父母的性别,父为M,母为F。回答询问时若出现未出现的人直接输出”Yes“,若两人性别相同输出”Never Mind“(^_^),最后一种为异性情况,用dfs1搜索t1五代以内的祖先,保存在set中,用dfs2搜索t2五代以内的祖先,若有交集令flag=1,否则flag=0,然后输出相应的信息即可。

AC代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. struct node{
  5. int sex,fa,ma;
  6. }a[];
  7.  
  8. int n,k,t1,t2,t3,flag;
  9. char c;
  10. set<int> s;
  11.  
  12. void dfs1(int p,int num){
  13. if(num>=) return;
  14. int ff=a[p].fa,mm=a[p].ma;
  15. if(ff>=){
  16. s.insert(ff);
  17. dfs1(ff,num+);
  18. }
  19. if(mm>=){
  20. s.insert(mm);
  21. dfs1(mm,num+);
  22. }
  23. }
  24.  
  25. void dfs2(int p,int num){
  26. if(num>=) return;
  27. int ff=a[p].fa,mm=a[p].ma;
  28. if(s.count(ff)||s.count(mm)){
  29. flag=;
  30. return;
  31. }
  32. if(ff>=){
  33. dfs2(ff,num+);
  34. if(flag) return;
  35. }
  36. if(mm>=){
  37. dfs2(mm,num+);
  38. if(flag) return;
  39. }
  40. }
  41.  
  42. int main(){
  43. scanf("%d",&n);
  44. for(int i=;i<;++i)
  45. a[i].fa=a[i].ma=-;
  46. while(n--){
  47. scanf("%d %c%d%d",&t1,&c,&t2,&t3);
  48. a[t1].sex=(c=='M')?:;
  49. a[t1].fa=t2,a[t1].ma=t3;
  50. a[t2].sex=;
  51. a[t3].sex=;
  52. }
  53. scanf("%d",&k);
  54. while(k--){
  55. scanf("%d%d",&t1,&t2);
  56. if(!a[t1].sex||!a[t2].sex)
  57. printf("Yes\n");
  58. if(a[t1].sex==a[t2].sex)
  59. printf("Never Mind\n");
  60. else{
  61. flag=;
  62. s.clear();
  63. dfs1(t1,);
  64. dfs2(t2,);
  65. if(flag)
  66. printf("No\n");
  67. else
  68. printf("Yes\n");
  69. }
  70. }
  71. return ;
  72. }

pta l2-16(愿天下有情人都是失散多年的兄妹)的更多相关文章

  1. PAT L2-016. 愿天下有情人都是失散多年的兄妹 (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)

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. JMeter做http接口功能测试

    1. 普通的以key-value传参的get请求 e.g. 获取用户信息 添加http请求:填写服务器域名或IP:方法选GET:填写路径:添加参数:运行并查看结果. 2. 以Json串传参的post请 ...

  2. C#字符串加密解密

    /// <summary> /// 加密字符串 /// 注意:密钥必须为8位 /// </summary> /// <param name="strText&q ...

  3. weblogic stage更改不马上生效

    在主机上domins中存在stage目录,且删除相关文件后页面访问报404 mc11>home/ap/user/domins/user/stage/project/project.war/js/ ...

  4. shell脚本判断执行用户

    在脚本中,判断执行者是否为root. 判断方法1, #!/bin/bash if [ `whoami` != "root" ];then echo " only root ...

  5. Linux的学习 --corntab

    计划任务的使用方法 http://www.cnblogs.com/CraryPrimitiveMan/p/4124851.html

  6. spring boot 的常用注解

    SpringBoot用于简化Spring应用的搭建,开发及部署:该框架采用注解的方式进行配置可以很方便的构建Spring应用. 1. @SpringBootApplication @SpringBoo ...

  7. 子类中的成员函数覆盖父类(name hiding)

    只要子类中出现了和父类中同名的函数,父类中的所有这个名字的函数,就被屏蔽了. 静态函数成员也是如此?经过代码验证,确实如此. #include <iostream> using names ...

  8. World Cup 996B(排队模拟)

    题意:有n个通道,按顺序每一次站一个通道,直到所站的通道没有人 分析:模拟这个过程 #include<cstdio> int main() { ]; while(~scanf(" ...

  9. python中time模块和datetime模块

    time模块和datetime模块 时间分为三种模式(time 模块) 时间戳   (time.time()) 格式化字符串 (time.strftime(%Y-%m-%d %H:%M:%S %p)) ...

  10. Linux下tomcat运行命令

    tomcat启动 [root@master webapps]# /usr/local/tomcat7.0/bin/catalina.sh start startup.sh的源代码,其实就是执行   c ...