最近公共祖先
参考资料
简介
最近公共祖先(Lowest Common Ancestor,LCA)指两个点的公共祖先中距离根节点最远的点。
倍增
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];
}
树链剖分
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;
}
例题
给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。