LCA 主要是用来处理当两个点仅有唯一一条确定的最短路径时的路径,且你的父亲也是你的祖先,而 LCA 还可以将自己视为祖先节点。
性质:求 B、C 两点间的距离,设 A 点为 B、C 两点的最近公共祖先,D 为任意一点,则有 |BC| = |BD| + |CD| - 2*|AD|。
常用的求LCA的算法有:Tarjan/DFS+ST/倍增,下面介绍离线的 Tarjan 算法:
顾名思义,就是在一次遍历中把所有询问一次性解决,所以其时间复杂度是O(n+q)。
Tarjan 算法基本思路:
1.任选一个点为根节点,从根节点开始。
2.遍历该点 u 所有子节点 v,并标记这些子节点 v 已被访问过。
3.若是 v 还有子节点,返回 2,否则下一步。
4.合并 v 到 u 上。
<