algorithm - 在无根树中查找多个 LCA

标签 algorithm tree least-common-ancestor lowest-common-ancestor

我正在尝试为无根树实现 LCA。我已经给出了一棵树(一个没有循环的连通无向图)和一系列关于一些根和两个顶点的 LCA 的查询。每个特定的查询都可以有不同的根,所以我不能使用在开始时为任意根预处理树的算法。

到目前为止,我已经尝试使用 DFS 找到从两个顶点到根的路径,然后检查它在哪里 fork ,但它有点慢(O(nq),其中 q 是查询数)。

关于如何预处理树以获得次线性查询复杂度的任何建议?

最佳答案

设 LCA(u, v, w) 是 v 和 w 相对于根 u 的 LCA。为了计算 LCA(u, v, w),我们可以计算,对于任何固定的 r,

LCA(r, u, v)
LCA(r, u, w)
LCA(r, v, w)

然后取出“奇怪的人”,即如果两个相等而第三个不同,则取出第三个,否则它们都相等,所以取出那个节点。

关于algorithm - 在无根树中查找多个 LCA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25371865/

相关文章:

algorithm - 面试中的LCA问题

algorithm - 范围最小查询 <O(n), O(1)> 方法(从树到受限 RMQ)

arrays - 在不使用多个数据结构的情况下,O(n) 时间内数组一侧的负数

algorithm - 从 Excel 导入中查找包含的边界区域

algorithm - 在 log(n) 时间内搜索元素

algorithm - Bellman-Ford 算法的中间最优性,是否正确?

java - 如何在java非递归中搜索一般树中的节点

php - 分层菜单树,包括任何级别的所有子项

algorithm - 是否有一种算法可以在有向有根树(树状结构)中找到最小成本路径?

algorithm - 最低共同祖先算法的实际应用是什么?