求LCA的过程:
两个节点平层同时往上跳,直到相遇,相遇的点就是他们的LCA。但是很明显,如果这棵树的深度较大,那么就要跳很久了,所以可以采用倍增优化
设 F[x, k] 表示 x 的 第 2^k 个祖先,即 x 节点向根节点走 2^k 步到达的节点。f[x, 0] 就是 x 节点第一个祖先(也即父节点)。若该节点不存在(跳到了根节点外),我们则令 f[x, k] = 0
因为从x走 2^k 步, 可以分为先走 2^(k-1) 步,再走2^(k-1)步
得出F[x,k]的递推方程
∀k∈[1,logn],F[x,k]=F[F[x,k−1]][k−1]
首先要先预处理出 树的每个节点的 F 数组和 深度数组 dep。通过 BFS 按照层次顺序,计算每个节点的 F 数组和 深度数组 dep。
void Depth(int x,int fx)
{
dep[x]=dep[fx]+1;
for(int i=1;i<=logN;i++)f