在无根树中找到多个LCA

时间:2014-08-18 20:54:58

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

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

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

如何预处理树以获得查询的次线性复杂性?

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:0)

以root身份获取任意顶点并预处理树以进行LCA。对于每个查询(u,v)和r作为root,让w为树中u和v的LCA。

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