最近公共祖先(LCA)

最近公共祖先 LCA 笔记 本文介绍了最近公共祖先(LCA)的概念和求解方法。LCA是指树结构中两个节点的公共祖先中离根最远的节点。文章阐述了LCA的7个重要性质,包括单节点、祖先关系、子树分布、遍历顺序等特性。在求解方法部分,详细讲解了朴素算法(时间复杂度O(n))和优化的倍增算法(预处理O(nlogn),查询O(logn)),后者通过预处理祖先数组和二进制拆分提高效率。最后提供了两个相关例题的链接。全文系统性地介绍了LCA的理论基础和实际应用。 阅读详情
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<stack>
#include<map>
using namespace std;
const int N = 1010;
const int K = 20;
vector<int> G[N];
int root;


int parent[K][N];
int depth[N];
int n, m;


void dfs(int v, int p, int d){
    parent[0][v] = p;
    depth[v] = d;
    for(int i = 0; i < G[v].size(); i++){
        if(G[v][i] != p) dfs(G[v][i], v, d + 1);
    }
}


void init(){
    dfs(root, -1, 0);
    for(int k = 0; k + 1 < K; k++){
        for(int v = 1; v <= n; v++){
            if(parent[k][v] < 0) parent[k + 1][v] = -1;
            else parent[k + 1][v] = parent[k][parent[k][v]];
        }
    }
}


int lca(int u, int v){
    if(depth[u] > depth[v]) swap(u, v);
    //将u,v合并都同一层
    for(int k = 0; k < K; k++){
        if((depth[v] - depth[u]) >> k & 1){
            v = parent[k][v];
        }
    }
    if(u == v) return u;//找到最近lca
    for(int k = K - 1; k >= 0; k--){
        if(parent[k][u] != parent[k][v]){
            u = parent[k][u];
            v = parent[k][v];
        }
    }
    return parent[0][u];
}


int main(){
    init();
    while(scanf("%d%d", &n, &m) != EOF){
        int a, b;
        for(int i = 0; i < n - 1; i++){
            scanf("%d%d", &a, &b);
            G[a].push_back(b);
            G[b].push_back(a);
        }
        root = 1;
        init();
        cout << "query" << endl;
        while(m--){
            scanf("%d%d", &a, &b);
            printf("%d\n", lca(a, b));
        }
    }
    return 0;
}
LCA——最近公共祖先 对于每个查询,从查询节点开始,向上遍历树,将遍历到的节点加入并查集中,直到找到一个已经在并查集中的节点,这个节点就是查询节点的最近公共祖先。当我们找到两个节点的路径时,我们可以比较路径中的节点,找到它们的最近公共祖先。树上倍增算法的核心思想是将每个节点的跳跃步长翻倍,以便在查询时能够快速跳到更高层的祖先节点。从两个路径的末尾开始,比较路径中的节点,直到找到它们的最近公共祖先。从根节点开始,进行深度优先搜索,记录每个节点的父节点和祖先节点。从根节点开始,进行深度优先搜索,记录每个节点的父节点。 阅读详情

相关推荐

Ubuntu环境下rknn-toolkit2的安装与兼容性解析

本文详细解析了在Ubuntu系统上安装瑞芯微rknn-toolkit2工具链的完整流程与关键注意事项。文章重点剖析了rknn-toolkit2与旧版rknn-toolkit的核心兼容性问题,强调两者在API、模型格式及运行时库上互不兼容,并推荐使用Conda虚拟环境进行隔离管理,为RK3566、RK3588等开发板的AI模型部署提供清晰的实践指南。

weixin_29041767的博客 375

最近公共祖先LCA算法

我是菜鸟ACMer(qwq),之前学图论板块的LCA算法做的一些笔记,适合小白,分享出来希望能帮助大家!

lwltql的博客 2529

PX4|Gazebo模型加载失败排查指南:从环境变量到资源路径的全面解析

本文针对PX4与Gazebo联合仿真中常见的'Unable to get model name'错误,提供了从环境变量配置、资源路径排查到网络访问问题的全面解决方案。详细解析了GZ_SIM_RESOURCE_PATH等关键变量的作用与设置方法,并给出了离线模型库部署等一劳永逸的修复指南,帮助开发者彻底解决无人机模型加载失败问题。

weixin_29243063的博客 1230

c++最近公共祖先LCA

今天来介绍一个c++中的算法:最近公共祖先LCA。最近公共祖先是什么呢?就是给出在树上的两个节点,求出它们的最近公共祖先,也可以理解成深度最深的公共祖先。这个算法用处很大,比如我们可以用它来求任意两个节点的距离。具体后面会讲。i++){//i从1开始!= edge[now][i]){//注意!!now的儿子不能再回到now的父亲了h;i++, h >>= 1){//例如h = (1011)2,那么第一次要跳,并且跳2^1也就是2^0级。

zhaoniuniu0309的博客,刚刚开始写博文的新手,有不对的地方请谅解。 2048

DrissionPage无头模式破盾记:实战绕过CloudFlare 5秒验证

本文详细介绍了如何使用DrissionPage无头模式绕过CloudFlare 5秒盾验证,提升爬虫效率。通过关键参数配置、服务器环境问题处理及高级绕过技巧,如动态UA轮换和鼠标移动模拟,帮助开发者有效应对反爬机制。实战案例展示了如何结合最新Chrome UA和参数设置实现稳定数据采集。

weixin_29327525的博客 488

BPMN2.0规范及流程引擎选型方案

本文主要简明扼要的介绍了BPMN2.0规范的内容,可让读者快速度的了解BPMN2.0所涵盖的主要内容和图形样式。也较为详细的阐述了如何绘制标准的流程图,以及在软件层面中如何实现业务流程功能,和技术选型。

比特桃 1万+

详解最近公共祖先(LCA)

详解最近公共祖先(LCA)

weq2011的博客 6028

基于8086微机原理数字钟计时器系统设计

*单片机设计介绍,基于8086微机原理数字钟计时器系统设计。

2201_75940997的博客 1281

树上最近公共祖先(LCA)

算法,图论,LCA

m0_74376772的博客 2198

在虚拟机上搭建FTP服务器

chroot_list_file=/etc/vsftpd/chroot_list # 对chroot_list下用户限制。[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf #打开配置文件。# 指定用户的shell: -s /usr/bin/nologin。# 在配置文件中找到以下几行代码, 去掉注释(去掉 "#"号)# 指定用户主目录:/data/ftp/ftpuser -M。(2)修改配置文件,路径/etc/vsftpd/ 下的文件。

weixin_70753380的博客 3211

SAP 固定资产采购简介

SAP 固定资产采购是指企业通过采购流程获取长期使用并记录为固定资产的物品。固定资产是企业为长期使用而购置的资产,如机器设备、办公设备、建筑物、车辆等,通常这些资产的使用期限较长,并且在资产负债表上记录。在SAP系统中,固定资产采购流程通常与物料管理(MM)模块和固定资产管理(FI-AA)模块相结合。这个过程涉及从需求的提出、采购订单的创建,到货物接收、发票校验和资产激活的多个步骤。

我小时候很黑的博客 1731

LCA-最近公共祖先

最近公共祖先简称。两个节点的最近公共祖先,就是这两个点的公共祖先里面,离根的那个。为了方便,我们记某点集 的最近公共祖先为LCAU1​U2​...Un​或LCAs。

weixin_42238183的博客 1795

6、深入解析Microsoft 365核心服务对比与迁移策略

本文深入解析了Microsoft 365的核心服务,包括身份和设备管理、现代设备配置体验、Exchange和SharePoint的迁移策略以及Microsoft Teams的协作功能。同时探讨了迁移过程中需要考虑的安全控制措施,为组织规划和实施云迁移项目提供了全面的指导和建议。

k8s6orchestrator的博客 107

最近公共祖先LCA(算法篇)

本篇将会讲解朴素和在线倍增的最近公共祖先算法,当然还有离线的算法,但是因为种种原因,Moon就更新到这了,后期可能会回归选择更新,感谢大家的喜欢

hellmorning的博客 2449

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

LCA最近公共祖先问题详解

图论和树结构中最近公共祖先(Least Common Ancestor,LCA)是一个经典的问题,本文我将详细介绍LCA问题的常见求解算法、优化策略,并结合Java代码示例,带你全面掌握这一重要算法问题的求解方法

1493

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【C++】最近公共祖先 LCA

最近公共祖先 百科名片 最近公共祖先 Lowest Common Ancestors LCA 简单引入 对于有根树T的两个结点u、v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u、v的祖先且x的深度尽可能大。 红色的都是是A和B的公共祖先,但只有最近的C才是最近公共祖先。 LCA问题是树上的一个经典问题,在很多方面有着广泛的应用,比如求LCP(最长公共前缀),接下来我们就来介绍...

Ljnoit 3500

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

LCA 最近公共祖先

参考:https://www.cnblogs.com/JVxie/p/4854719.html 首先是最近公共祖先的概念(什么是最近公共祖先?): Tarjan/DFS+ST/倍增     在一棵没有环的树上,每个节点肯定有其父亲节点和祖先节点,而最近公共祖先,就是两个节点在这棵树上深度最大的公共的祖先节点。     换句话说,就是两个点在这棵树上距离最近的公共祖先节点。     ...

森宝的博客 490

『图论』LCA 最近公共祖先

转载记得告诉千千哦~同步更新:https://www.dreamwings.cn/lca/4874.html概述篇LCA (Least Common Ancestors) ,即最近公共祖先,是指这样的一个问题:在一棵有根树中,找出某两个节点 u 和 v 最近的公共祖先。 LCA 可分为在线算法与离线算法 在线算法:指程序可以以序列化的方式一个一个处理输入,也就是说在一开始并不需要知道所有的输入。 离

小坏蛋_千千 4845

P3379 【模板】最近公共祖先(LCA)

路径压缩的基本思想是,在执行查找操作时,将访问路径上的所有节点直接连接到根节点上。这样做的目的是在下一次查找操作时,能直接访问到根节点,从而减少路径长度,提高查找效率。如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。,分别表示树的结点个数、询问的个数和树根结点的序号。行,每行包含一个正整数,依次为每一个询问的结果。行每行包含两个正整数。行每行包含两个正整数。的最近公共祖先,故为。的最近公共祖先,故为。的最近公共祖先,故为。的最近公共祖先,故为。的最近公共祖先,故为。结点的最近公共祖先。

cc_even的博客 2078

【洛谷 P3379】最近公共祖先【LCA模板】

题目描述 题目 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。 输入格式 第一行包含三个正整数 N,M,SN,M,SN,M,S,分别表示树的结点个数、询问的个数和树根结点的序号。 接下来 N−1N−1N−1 行每行包含两个正整数 x,yx,yx,y,表示 xxx 结点和 yyy 结点之间有一条直接连接的边(数据保证可以构成树)。 接下来 MMM行每行包含两个正整数 a,ba, ba,b,表示询问 aaa 结点和 bbb 结点的最近公共祖先。 输出格式 输出包含 MMM 行,每行包含一个正整数

绫 1711

【图论】—— 最近公共祖先(LCA)

【图论】—— 最近公共祖先(LCA)

forever_bryant的博客 2367

Lca 最近公共祖先

最近公共祖先 目录 简介 实例算法   最近公共祖先(Least Common Ancestors)   LCA 编辑本段简介   对于有根树T的两个结点u、v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u、v的祖先且x的深

robertin的专栏 1149

最近公共祖先 (LCA)

5. 让两个点同时往上跳,一直跳到它们最近公共祖先的下一层。4. 先将两个点跳到同一层。

Heait的博客 937

最近公共祖先LCA

最近公共祖先LCA 若两个节点的祖先相同,则叫该节点的公共祖先 简称LCA 显然,两个节点的LCA只有一个,且一定是两个点到根的路径中重复部分最下端的点 算法1: 求出每一个结点的深度 询问两个节点是否重合,若重合,则LCA已求出 否则,选择两个点中深度较大的点,并移动到他的父亲 重复执行2,3步 上图的执行流程如下: 两个指针位于3与9。 此时9节点深度较大,向上移动到它的父...

han_yiyang的博客 338

LCA最近公共祖先详解

最近公共祖先LCA(lowest common ancestor) 在图论和计算机科学中,最近公共祖先(英语:lowest common ancestor)是指在一个树或者有向无环图中同时拥有v和w作为后代的最深的节点。在这里,我们定义一个节点也是其自己的后代,因此如果v是w的后代,那么w就是v和w的最近公共祖先。 最近公共祖先是两个节点所有公共祖先中离根节点最远的,计算最近公共祖先和根节点的长度...

weixin_43736492的博客 737
上一篇: poj 1338 ugly numbers
下一篇: ZOJ 3195 Design the city
IT旅行
博客等级 码龄12年 3粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值