本文介绍了一种高效的求解最近公共祖先(Least Common Ancestor, LCA)问题的方法——倍增算法。通过预处理每个节点的2^i阶父节点,可以在O(log N)的时间复杂度内解决LCA问题,其中N为节点数。文章提供了完整的C++代码实现,展示了如何进行DFS遍历以初始化数据结构,并给出了查找LCA的具体步骤。
代码
// 倍增int maxbit;
int dpth[maxn], ance[maxn][maxb];
void dfs(int u, int fath){
dpth[u] = dpth[fath] + 1;
ance[u][0] = fath;
for(int i = 1; i <= maxbit; ++i) ance[u][i] = ance[ance[u][i-1]][i-1];
for(int l = last[u]; l; l = next[l]){
int v = dstn[l];
if(v == fath) continue;
dfs(v, u);
}
}
int lca(int u, int v){
if(dpth[u] < dpth[v]) swap(u, v);
int p = dpth[u] - dpth[v];
for(int i = 0; i <= maxbit; ++i)
if(p & (1 << i)) u = ance[u][i];
if(u == v) return u;
for(int i = maxbit; i >= 0; --i){
if(ance[u][i] == ance[v][i]) continue;
u = ance[u][i];
v = ance[v][i];
}
return ance[u][0];
}