LCA的多种求法(超详细!!!)

本文详细介绍了两种求解树上最近公共祖先(LCA)的方法:树上倍增法和树链剖分。树上倍增法通过预处理f数组,实现O(nlogn)的预处理时间和O(logn)的查询时间。树链剖分通过轻重边剖分,将树转化为链,使得查询LCA更为高效。并给出了相关例题及解法,适用于解决点间距离的查询问题。
摘要由CSDN通过智能技术生成

倍增求LCA

(1)树上倍增法 预处理

设f[x,k]表示x的2^k辈祖先,即从x向根节点走2^k步到达的节点。特别地,若该节点不存在,则令f[x,k]=0。f[x,0]就是x的父节点。可以得出f[x][k]=f[f[x][k-1]][k-1]。

我们可以对树进行遍历,由此得到f[x,0],再计算f数组所有值。

以上部分是预处理,时间复杂度为O(nlogn)。之后可以多次对不同的x,y计算LCA,每次询问的时间复杂度为O(logn)。

 
 
【代码实现】 预处理
void dfs(int u,int father)  
{
    Dep[u]=Dep[father]+1;    
    for(int i=0;i<=19;i++)
    {
    if(!f[u][i)break;
    else f[u][i+1]=f[f[u][i]][i];  
    }
    for(int e=first[u],v; v=go[e],e; e=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值