题目描述

由于这个跟后几周是一个系列,这周的做法比较简单。

把第一个人的所有祖先做标记,第二个人向上查找祖先直到找到一个标记过的节点或无法继续为止。

代码其实没什么意思。

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;public class Main {private static class Person {String name;String father;boolean tag = false;protected Person(String name, String father) {this.name = name;this.father = father;}}public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();in.nextLine();Map<String, Person> heritage = new HashMap<String, Person>();for (int i = 0; i < n; i++) {String line = in.nextLine();String[] people = line.split(" ");String father = people[0];String son = people[1];Person newPerson = new Person(son, father);heritage.remove(son);heritage.put(son, newPerson);if (heritage.get(father) == null) {Person newFather = new Person(father, null);heritage.put(father, newFather);}}int m = in.nextInt();in.nextLine();for (int i = 0; i < m; i++) {String line = in.nextLine();String[] people = line.split(" ");if (people[0].equals(people[1])) {System.out.println(people[0]);continue;}Person p1 = heritage.get(people[0]);Person p2 = heritage.get(people[1]);Person pt = p1;while (p1 != null) {pt.tag = true;if (pt.father == null) {break;} else {pt = heritage.get(pt.father);}}pt = p2;while (pt != null && pt.tag == false) {if (pt.father == null) {break;} else {pt = heritage.get(pt.father);}}if (pt == null || pt.tag == false) {System.out.println(-1);} else {System.out.println(pt.name);}pt = p1;while (p1 != null) {pt.tag = false;if (pt.father == null) {break;} else {pt = heritage.get(pt.father);}}}heritage.clear();in.close();}
}

吐槽:A和A的公共祖先是谁?A如果没出现在描述的父子关系中呢?好坑……

转载于:https://www.cnblogs.com/xblade/p/4480332.html

[hiho 13]最近公共祖先 一相关推荐

  1. Java算法学习13——最近公共祖先

    一.算法思路: 本节主要为最近公共祖先,算法利用的为递归的方式,总体思路就是先从根节点出发,然后判断根节点的子节点是否包含需要寻找最近公共祖先的左右节点,如果包含的话则往下一层继续寻找,具体的思路可以 ...

  2. [hiho 15]最近公共祖先 二

    题目描述 这次使用离线算法来解决最近公共祖先的问题. 离线算法可以一遍 dfs 处理完所有的查询,因而需要把查询全部储存起来. 具体的 dfs 过程是: 所有节点最初标记为白色,第一次经过该节点时,将 ...

  3. [hiho 17]最近公共祖先 三

    题目描述 这次是使用在线算法解决这个问题. 两个节点的最近公共祖先就是这两个节点的通路上深度最浅的那个节点. 可以通过一遍深搜把树转成数组:每次经过一个节点(无论是从父节点进入还是从子节点返回)时,把 ...

  4. LeetCode实战:二叉树的最近公共祖先

    背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Given a bin ...

  5. LeetCode实战:二叉搜索树的最近公共祖先

    背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Given a bin ...

  6. [最近公共祖先(LCA)]

    首先这个题 很毒瘤 被数据卡了 很长时间 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问 ...

  7. LCA 在线倍增法 求最近公共祖先

    第一步:建树  这个就不说了 第二部:分为两步  分别是深度预处理和祖先DP预处理 DP预处理: int i,j;for(j=1;(1<<j)<n;j++)for(int i=0;i ...

  8. tarjan算法_【朝夕的ACM笔记】树上问题-最近公共祖先-倍增算法

    [朝夕的ACM笔记]目录与索引 最近公共祖先-倍增算法 一.基本概念 最近公共祖先问题:对于给定的一颗有根树,求其两个节点的最近公共祖先. 祖先:节点本身.节点的父亲.节点父亲的父亲--都是该节点的祖 ...

  9. 洛谷 P 3379 【模板】最近公共祖先(LCA)

    题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...

最新文章

  1. Linux的判断命令
  2. Linux之chattr命令详解
  3. mysql数据库计算两列数据的和_在sql中对两列数据进行运算作为新的列操作
  4. 产品经理如何让程序员放下手中的刀?
  5. Window.ActiveXObject的用法 以及如何判断浏览器的类型
  6. 做游戏,学编程(C语言) 7 学习EasyX图形交互功能----flappy bird源代码
  7. Ubuntu配置maven
  8. 动态创建Sql Server数据库相关(全)
  9. vue-awesome-swiper 的安装和使用
  10. MySQL 编码相关小结
  11. 自定义函数计算某个字符在字段中出现的次数
  12. 编码表/转义字符/进制转换
  13. git管理工具从网上检索下来的项目没有绿色对勾
  14. 安川服务器显示fn001,安川伺服驱动器功能参数设置
  15. vue 富文本编辑器上传图片到服务器并显示到富文本中
  16. 毕业6年,我和同学的差距是这样拉开的
  17. vue elementUI弹窗使用destroy-on-close后,关闭弹窗会重新发送请求
  18. 程序员笑话常客:“rm -rf *“和 “rm -rf /*“的区别
  19. 用PS怎样把一张图片切割成几张小图片?
  20. 2021-07-15 安装less-loader依赖

热门文章

  1. teradata查看正在运行的进程_使用 Oracle GoldenGate 进行实时数据集成
  2. android 广播 onreceive能干什么,android BroadcastReceiver 广播 onReceive()执行多次
  3. 赵国栋:大数据时代经济发展转型之道
  4. java tinyint_java – 将一个tinyint映射为boolean hibernate
  5. Python实现不同交互界面跳转(创建子界面)
  6. ASP.NET(C#)图片加文字、图片水印(转)
  7. JDBC中的execute与executeUpdate
  8. 阿里巴巴校招内推简历筛选方案(总结篇)
  9. Docker2375端口未授权getshell
  10. 新版firefox中没有firebug了