离线快速LCA(最近公共祖先) Tarjan算法
离线快速LCA(最近公共祖先) Tarjan算法
前言
对于 OIer 来说,LCA 一直是处理树上问题的好帮手,无论是倍增还是树剖都有着优秀的 数据规模)的上进,需要更快速求 LCA,于是就有了……
反正之前打死我都不相信这玩意能离线,还能 O(1)
算法思路
首先来一棵树:

我们然后我们将要求 LCA 的点对之间加上一条虚边:
如图,我们将对求点 (7,5)、(8,9)、(11,3) 的 LCA。
一开始每个节点属于一个并查集。
接下来我们通过原树边 DFS 遍历每一个节点,在该节点
此时如果
反之则不进行任何操作。
然后节点
解释一下原理:
当前
不难发现
这种通过并查集连接祖先求 LCA 的方法十分巧妙。
CODE
inline void dfs(int u)
{
for(ri i=head[u];i;i=edge[i].nxt)
{
int v=edge[i].to;
if(vis[v]) continue;
dfs(v);
fa[v]=u;//并查集连向父亲
}
for(pair<int,int> i:EL[u])//遍历虚边
{
if(vis[i.F]) Lca[i.S]=frt(i.F);//frt 求该并查集的根
}
vis[u]=1;//遍历标记
}
//i.F 是节点的编号,i.S 是问题的编号
时间复杂度分析
预处理
总时间
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现