【算法笔记】LCA问题-tarjan 离线算法

本文介绍了一种高效的离线最低公共祖先(LCA)算法。该算法通过一次深度优先搜索(DFS)来批量处理所有的查询请求。核心思想在于利用等价类合并的方法,将已访问节点及其子树归并为一类,并指定一个代表节点ancestor[u],以此来快速求解任意两个节点间的最低公共祖先。

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

reference:

http://en.wikipedia.org/wiki/Tarjan%27s_off-line_lowest_common_ancestors_algorithm

http://scturtle.is-programmer.com/posts/30055.html

算法流程:

1)读入表示父子关系的树

2)储存所有询问

3)一次DFS回答所有询问

算法的关键是:

对于一个正在访问中的节点u,其访问过的子树加上这个节点本身合并为一个等价类,等价类有一个代表元ancestor,值为u。对于u的一个未访问过的子节点v,如果属于询问 query(v, w)且w已访问过,则LCA(v,w) = ancestor[w]。

下图中,正访问到节点10

set1-4是目前的4个等价类

当 node 10 访问过后,set5 将会被合并到 set4 中,同样的,set3 会被合并到 set2 中。。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值