LCA 倍增

核心:

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

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

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
原文地址:https://www.cnblogs.com/Lamboofhome/p/15473258.html