我正在尝试为无根树实施LCA。我已经给出了一个树(一个没有循环的连通无向图)和一些关于某些根和两个顶点的LCA的查询。每个特定的查询都可以有不同的根,所以我不能使用在开始时对任意根进行预处理的算法。
到目前为止,我已经尝试使用DFS找到从顶点到根的路径,然后检查它在哪里发散,但是它有点慢(O(nq),其中q是查询数)。 / p>
如何预处理树以获得查询的次线性复杂性?
答案 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。