【问题标题】:Find multiple LCAs in unrooted tree在无根树中查找多个 LCA
【发布时间】:2014-08-18 20:54:58
【问题描述】:

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

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

有什么建议如何预处理树以使查询具有亚线性复杂性?

【问题讨论】:

  • 在这种情况下,LCA 到底是什么意思? LCA 的“最低”部分通常可以从树的根性中推断出来,但没有它我不确定它是否定义明确。你能举一两个例子吗?
  • T 中 v 和 w 的 LCA 是离根最远的 v 和 w 的共享祖先。在每个查询中,我都给出了一个顶点,它是这个特定查询的树的根,所以我计算 LCA 就像树根植于这个顶点一样。问题的困难在于树可以针对不同的查询以不同的顶点为根,因此我无法针对任何特定的根对其进行预处理,并且无法在树节点中存储例如指向父节点的指针,因为父节点的含义可以改变在下一个查询中。
  • 感谢您的澄清!确认一下,您的查询是 LCA(u, v, r) 的形式,意思是“如果树以 r 为根,u 和 v 的 LCA 会是什么?”
  • 是的,这正是我的意思。

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


【解决方案1】:

令 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)

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

【讨论】:

  • 谢谢,这正是我想要的!
  • @sudeepdino008 除了令人不快的案例分析之外,我没有任何进一步的发现。
【解决方案2】:

以任意顶点为根并对树进行 LCA 预处理。对于每个查询 (u,v) 和 r 作为根,设 w 是树中 u 和 v 的 LCA。

  • 如果 w 在 r 的子树中,则 w 就是答案。
  • 如果 r 在 w 的子树中,那么 r 就是答案。
  • 如果 r 在 u 或 v 的子树中,则对应的顶点就是答案。

【讨论】:

    猜你喜欢
    • 2021-12-20
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 2010-12-08
    • 2021-02-05
    • 1970-01-01
    相关资源
    最近更新 更多