1.倍增
可以理解为暴力的优化.先让两个点跳在同一高度,再一起跳2^k次倍祖先.
难点:倍增数组转移方程:bz[i][j]=bz[bz[i][j-1]][j-1]
2.RMQ
提前说明这种算法比较慢,且很容易错.写在这里便于对RMQ的理解复习.
大概思路是建树后跑一遍dfs以求dfn,用数组记录点在dfn中的第一次出现的位置.
LCA一定在这两个点的dfn区间内,用RMQ求区间深度最小即LCA.有一点说
明的是在构建RMQ时用数组用同样的方式记录最小值对应的点.
3.tarjan
提前说明为离线算法,复杂度O(n+q),较快.ps:q为询问次数.
大概思路为构建已经存在的树与询问树.先dfs遍历已经存在的树,
再从遍历的节点中寻找询问树中与其关联的节点.看询问树中的节点是否
遍历过,遍历过就一定走过了LCA,用并查集维护最开始的爸爸则是LCA.
其中疑问,最开始的爸爸不是根结点吗?不,根节点的儿子还为遍历回去,还未认这个爸爸.
以此类推,存在树中的所有子树结构均满足这中关系.