跳到主要内容

最近公共祖先

参考资料

简介

最近公共祖先(Lowest Common Ancestor,LCA)指两个点的公共祖先中距离根节点最远的点。

倍增

245 Bcpp
int lca(int u,int v)
{
if(dep[u]<dep[v])swap(u,v);
for(int i=20;i>=0;i--)
{
if(dep[a[u][i]]>=dep[v])u=a[u][i];
}
if(u==v)return u;
for(int i=20;i>=0;i--)
{
if(a[u][i]!=a[v][i])
{
u=a[u][i];
v=a[v][i];
}
}
return a[u][0];
}

树链剖分

136 Bcpp
int lca(int u,int v)
{
while(top[u]!=top[v])
{
if(dep[top[u]]<dep[top[v]])swap(u,v);
u=fa[top[u]];
}
return dep[u]<dep[v]?u:v;
}

例题

给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。