LCA 倍增

核心:

2 利用 dep工具 ,将2个点放到一个深度 然后同时向上爬

1 通过倍增法 利用 2进制模式 快速向上爬,来查到到最想要的那个数据。

 用法: 通过预处理, 使得查询时可以到达 lg的复杂度, 多用于 找到某个点,或者区间

void dfs(int a,int ba)
{
    vis[a]=1;dep[a]=ba;
    for(ri i=0;i<p[a].size();i++)
    {
        int b=p[a][i];
        if(vis[b]) continue;
        fa[b][0]=a;
        for(ri i=1;i<20;i++)
        {
            fa[b][i]=fa[fa[b][i-1]][i-1];
        }
        dfs(b,ba+1);
    }
}
int ck(int a,int b)
{
    if(dep[a]<dep[b]) swap(a,b);
    for(ri i=20;i>=0;i--)
    {
        if(dep[fa[a][i]]>=dep[b])
        {
            a=fa[a][i];
        }
    
    }    
    if(a==b) return b;
    for(ri i=20;i>=0;i--)
    {
        if(fa[a][i]!=fa[b][i])
        a=fa[a][i],b=fa[b][i];
    }

    return fa[a][0];
}
倍增法 LCA

 

posted @ 2021-10-27 22:01  VxiaohuanV  阅读(27)  评论(0编辑  收藏  举报