【发布时间】: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