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

本文介绍了如何解决寻找给定有根多叉树中两个节点的最近公共祖先(LCA)问题。首先,通过邻接链表建立树结构并获取节点的深度信息。接着,提供基础的DFS解决方案,然后分析基础代码在处理大规模数据时可能遇到的时间复杂度问题。为优化算法,文章引入二进制拆分和树上倍增的方法,详细解释了如何利用这些技巧降低时间复杂度,包括调整上提层数、增加father数组维度以及利用lowbit。最后,文章提到了在实际实现过程中需要注意的细节,如在第三步和第四步之间的判断,以确保正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

题目大意:

输入格式:

输出格式:

说明/提示:

基础代码:

思路:

优化:

核心:二进制拆分和树上倍增


题目大意:

给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。

输入格式:

第一行包含三个正整数 N,M,S,分别表示树的结点个数、询问的个数和树根结点的序号。

接下来 N−1 行每行包含两个正整数 x,y,表示 x 结点和 y 结点之间有一条直接连接的边(数据保证可以构成树)。

接下来 M 行每行包含两个正整数 a,b,表示询问 a 结点和 b 结点的最近公共祖先。

输出格式:

输出包含 M 行,每行包含一个正整数,依次为每一个询问的结果。

说明/提示:

对于 30%的数据,N≤10,M≤10M≤10。

对于 70%70% 的数据,N≤10000,M≤10000。

对于 100%100% 的数据,1≤N,M≤500000,1≤x,y,a,b≤N,不保证 a≠b。

基础代码:

思路:

1. 用邻接链表存储。
2. 用邻接链表为每个节点生成父亲节点和深度的信息。
&nb

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值