关于求LCA三种方法

匿名 (未验证) 提交于 2019-12-02 23:49:02

1.倍增

可以理解为暴力的优化.先让两个点跳在同一高度,再一起跳2^k次倍祖先.

难点:倍增数组转移方程:bz[i][j]=bz[bz[i][j-1]][j-1]

BZCLCA

2.RMQ

提前说明这种算法比较慢,且很容易错.写在这里便于对RMQ的理解复习.

大概思路是建树后跑一遍dfs以求dfn,用数组记录点在dfn中的第一次出现的位置.

LCA一定在这两个点的dfn区间内,用RMQ求区间深度最小即LCA.有一点说

明的是在构建RMQ时用数组用同样的方式记录最小值对应的点.

RMQLCA

3.tarjan

提前说明为离线算法,复杂度O(n+q),较快.ps:q为询问次数.

大概思路为构建已经存在的树与询问树.先dfs遍历已经存在的树,

再从遍历的节点中寻找询问树中与其关联的节点.看询问树中的节点是否

遍历过,遍历过就一定走过了LCA,用并查集维护最开始的爸爸则是LCA.

其中疑问,最开始的爸爸不是根结点吗?不,根节点的儿子还为遍历回去,还未认这个爸爸.

以此类推,存在树中的所有子树结构均满足这中关系.

TARJANLCA

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!