完整部分点这里
平常在信息学竞赛中求LCA一般有三种办法:
- 用倍增法求解,预处理复杂度是 O ( n log n ) O(n\log n) O(nlogn) ,每次询问的复杂度是 O ( log n ) O(\log n) O(logn), 属于在线解法。
- 利用欧拉序转化为RMQ问题,用 ST表 求解RMQ问题,预处理复杂度 O ( n + n log n ) O(n + n \log n) O(n+nlogn) ,每次询问的复杂度为 O ( 1 ) O(1) O(1), 也是在线算法。
- 采用Tarjan算法求解,复杂度 O ( α ( n ) + Q ) O(\alpha(n) + Q) O(α(n)+Q) ,属于离线算法。
上述三种算法都比较常用,这篇文章主要介绍第二种解法。
先介绍一下欧拉序:
对有根树T进行深度优先遍历,无论是递归还是回溯,每次到达一个节点就把编号记录下来,得到一个长度为 2 N − 1 2N - 1 2N−1 的序列,成为树 T 的欧拉序列F。
如图1(Inkscape手画,略丑轻喷~):
[外链图片转存失败(img-bLDJAzZw-1562835893221)(https://s1.ax2x.com/2018/08/05/55YtmN.png)]
图 1 − 有 根 树 T 图 \ 1 - 有根树T 图 1−