代码编织梦想

一 点睛 

最近公共祖先指有根树中距离两个节点最近的公共祖先。祖先指从当前节点到树根路径上的所有节点。

u 和 v 的公共祖先指一个节点既是 u 的祖先又是 v 的祖先,u 和 v 的最近公共祖先指距离 u 和 v 最近的公共祖先。若 v 是 u 的祖先,则 u 和 v 的公共祖先是 v。

可以使用 LCA 求解树长任意两点之间的距离,求 u 和 v 之间的距离时,若 u 和 v 的最近公共祖先为  lca,则 u 和 v 之间的距离为 u 到树根的距离,加上 v 到树根的距离减去 2 倍的 lca 到树根的距离。

dist[u] + dis[v] - 2 * dist[lca]

求解 LCA 的方法有很多,包括暴力搜索法、树上倍增法、在线 RMQ 算法、离线 Tarjan 算法和树链剖分。

在线算法:以序列化方式一个一个的处理输入,也就是说,在开始时并不知道所有的输入,在解决一个问题后立即输出结果。

离线算法:在开始时,已知问题的所有输入数据,可以一次性回答所有问题。

二 暴力搜索法

暴力搜索法有两种:向上标记法和同步前进法。

1 向上标记法

从 u 向上一直到根节点标记所有经过的节点,若 v 已被标记,则 v 节点为 LCA(u,v) ,否则 v 也向上走一步。第 1 次遇到已标记节点时,该节点为 LCA(u,v)。

2 同步前进法

将 u、v 中较深的节点向上走到深度较浅的节点的同一深度,然后两个节点一起向上走,直到走到同一节点,该节点就是 u 和 v 的最近公共祖先。记作 LCA(u,v)。若较深的节点 u 到达 v 的同一深度时,那个节点正好是 v 则节点,则 v 节点为 LCA(u,v) 

3 算法分析

以暴力搜索法求解 LCA,两种方法的时间复杂度在最坏情况下均为 O(n)。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chengqiuming/article/details/126687100

【C++】最近公共祖先 LCA-爱代码爱编程

最近公共祖先 百科名片简单引入LCA的算法暴力枚举法Tarjan离线算法倍增算法例题:题目描述输入描述输出描述样例输入样例输出代码 百科名片 最近公共祖先Lowest Common AncestorsLCA简单引入 对于有根树T的两个结点u、v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u、v的祖先且x的深度尽可能大。 红色的

最近公共祖先LCA问题-爱代码爱编程

题目描述 给定两个int a,b。给定节点编号,请返回a和b的最近公共祖先的编号。 思路:利用父子节点之间的关系 **root=child/2;**让a,b之间的较大数一直除2,同时让a,b往上走,直到a==b,就找到了公共祖先 代码实现 import java.util.*; public class LCA { public

最近公共祖先LCA-爱代码爱编程

最近公共祖先(Lowest Common Ancestors,LCA)指有根树中距离两个节点最近的公共祖先。祖先指从当前节点到树根路径上的所有节点。 u和v的公共祖先指一个节点既是u的祖先,又是v的祖先。u和v的最近公共祖先指距离u和v最近的公共祖先。若v是u的祖先,则u和v的最近公共祖先是v。      可以使用LCA求解树上任意两点之间的

最近公共祖先LCA倍增算法-爱代码爱编程

LCA定义 LCA(Least Common Ancestors):最近公共祖先即两个结点最近的公共祖先 由上图可以看到 5号结点和7号结点的LCA为3号结点,9号结点和7号结点的LCA为7号结点。 一般算法 首先可以将两个结点统一到相同深度,然后一起向上一步一步走,直到他们踩到相同点,则该点为他们的LCA 。 (

最近公共祖先(LCA)-爱代码爱编程

一.暴力解法(一) 会超时 对于点x,y。向上搜索点x节点的父节点,并将搜索到的父节点依次标记为走过,然后再搜索y节点的父节点,当搜索到第一个已经标记了的节点时,即为他们的最近的公共祖先。 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。 输入格式 第一行包含三个正整数 N,M,SN,M,S,分别表示树的结点个数、询问的个数

LCA最近公共祖先算法-爱代码爱编程

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 示例 1: 输入:root = [3,5,1,6,2,0,8,null,null,7,4],

最近公共祖先lca的三种求法_litian355的博客-爱代码爱编程

最近公共祖先的定义:如果结点c满足: 目录 1.向上标记法 2.倍增算法 3.用离线的tarjan算法求LCA 时间复杂度O(n+m)          1172. 祖孙询问 1171. 距离 1.c是a和b的公共祖宗结点。 2.c是距离a,b最近的公共祖宗节点。 那么就称c是a和b的最近公共祖先。 1.向上标记法 分别从a,

图论--最近公共祖先lca_信奥教练andy的博客-爱代码爱编程

最近公共祖先LCA LCA(Least Common Ancestors),即最近公共祖先,是指这样一个问题:在有根树中,找出某两个结点u和v最近的公共祖先(另一种说法,离树根最远的公共祖先) 最近公共祖先是相对于两个节点来说的,一般来说,最近公共祖先为节点 u和节点 v的最近的公共祖先。若 u 为 v 的祖先或者 v 为 u 的祖先,则LCA(u,v

最近公共祖先lca 倍增法_brokenrivers的博客-爱代码爱编程

 之前学习了Tanjan求LCA的解法, 最近公共祖先(LCA)Tarjan_Brokenrivers的博客-CSDN博客 这次学习一下倍增法 倍增基于一个常识,任何一个数都能表示为2的幂之和的形式如 9=2^3+2^0=1001 也就是二进制的形式,基于此,对于线性的过程,则可以通过2^x的跳跃实现log级别的复杂度。 最暴力的LCA做法就是手

3.2 创建会员中心微服务模块 -service provider_要学就学灰太狼的博客-爱代码爱编程

文章目录 3.2 创建会员中心微服务模块 -service provider 3.2.1 需求说明/图解 3.2.2 思路分析/图解

jxtms+职教:saas模式的低门槛开发实训_jxandrew的博客-爱代码爱编程

jxTMS+职教是基于jxTMS平台【详见:jxTMS简介】开发的面向职教的产品,主要提供基础的应用开发训练。 笔者曾带过一个高职的java实训班,班中一多半的学生最后放弃治疗去学测试和html了,剩下的学生中也只有寥寥几

kafka系列(一)安装使用及基本原理_程序员劝退师丶的博客-爱代码爱编程

        kafka在大数据生态中扮演者重要的角色,各个系统利用Kafka作为数据中转枢纽来实时消费所有类型的数据。同份Kafka数据可以被导入到不同专用系统中,由于新系统能通过订阅Kafka,轻易地获取它想要的数据,我们可以轻松地引入额外的专用系统,进入到这系统构架中 Kafka传统定义: Kafka是一个分布式的基于发布/订阅模式的消息队列(

acwing 1172. 祖孙询问 题解(最近公共祖先lca)-爱代码爱编程

AcWing 1172. 祖孙询问 寻找最近公共祖先lca模板题 #include<bits/stdc++.h> using namespace std; const int N = 4e4 + 10,

[模板]最近公共祖先lca-爱代码爱编程

目录 Description Format Input Output Samples 输入数据 1 输出数据 1 分析 代码 Description 给出N,Q .N<=5*10^5 代表一个树有N个点 ,树的根为1 Q代表有Q个询问,询问A,B的最近公共祖先是哪一个. Format Input 第一行给出N,

redis持久化rdb和aof的区别;以及aof的重写-爱代码爱编程

概述 redis有两种持久化方式: redis默认采用的RDB方式 RDB(Redis DataBase):在指定的时间间隔内,执行指定次数的写操作,则会将内存中的数据写入到磁盘中。即在指定目录下生成一个dump.rdb