最近公共祖先(lca)与树上叉分

本文深入解析了LCA(最近公共祖先)算法的实现原理,通过代码示例详细介绍了如何利用深度优先搜索进行LCA查找,并展示了树上叉分在路径修改与点区间更新的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

lca的定义不在过多解释,

代码如下:

inline void bfs()
{
    queue<int>q;
    deep[s]=1;q.push(s);
    while(!q.empty())
    {
        int x=q.front();q.pop();
        for(int i=link[x],y;i;i=a[i].next)
        {
            if(deep[y=a[i].y]) continue; //如果搜索到的节点,深度已经
            deep[y]=deep[x]+1; //有值,则说明已经便利过了.
            f[y][0]=x;q.push(y);
            for(int j=1;j<=20;++j) f[y][j]=f[f[y][j-1]][j-1];
        }
    }
}
inline void lca(int x,int y)
{
    if(deep[x]>deep[y]) swap(s,y); //将深度大的放在y上. 
    for(int i=20;i>=0;--i)
        if(deep[f[y][i]]>=deep[x]) y=f[y][i]; //将y一直跳到和x深度一样 
    if(x==y) return x;
    for(int i=20;i>=0;--i)
        if(f[y][i]!=f[x][i])
            x=f[x][i],y=f[y][i];   //将x与y同时跳到lca的两个儿子. 
    return f[x][0];              
} 

树上叉分:用于树上两点以及之间的路径上各个点点区间修改:

例如:(x,y)之间路径上的点都加一,可以将x++,y++,lca(x,y)--,fa[lca(x,y)]--;最后统计各个点的权值即可.

 

转载于:https://www.cnblogs.com/gcfer/p/11125781.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值