推荐博客 : http://blog.csdn.net/lw277232240/article/details/72870644
LCA 就是去寻找最近公共祖先 ,如上图中 10 与 11 的LCA是 6 ,7 和 12 的LCA 是 4 。
通过这个我们可以解决的一类问题就是 求任意两点之间的距离。
对于这个问题,我们首先最暴力的可以写出一个深搜,复杂度是 O(n),对于多次查询的话肯定会超时。
在看上图,比如让求 10 和 11 的距离,首先我们可以将他们放置同一层,然后向上一步一步的移动。当他们的父亲相同时,那么就结束移动过程。这样的操作最复杂的情况也是 O(n)的,那要怎么去优化呢?可以采用二进制的思想,每次向上去跳动,这里的二进制思想和完全背包的很像。
在这里会用到两个数组 grand[x][i], 表示 点 x 向上移动 2 ^ i 。那么会得到的关系式是 grand[x][i] = grand[grand[x][i-1]][i-1], 这是成立的,因为 2^4 等于 2^3 + 2^3 。
gw[x][i] 数组,表示的是点 x 向上移动 2^i 后的距离是多少,gw[x][i] = gw[x][i-1] + gw[grand[x][i-1]][i-1] 。
如果一直按照这种思路我们可以去求得很多的量,比如去求 两个点之间线段的最大长度, maxx[x][i] = max(maxx[x][i-1], maxx[grand[x][i-1]][i-1] )