LCA

Posted reshuffle

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LCA相关的知识,希望对你有一定的参考价值。

#include <bits/stdc++.h>
#define FOR(I, A, B) for (int I = (A); I <= (B); ++I)
#define PER(I, A, B) for (int I = (A); I >= (B); --I)
#define DB(A) cout<<(A)<<endl;
#define PB push_back
#define Pair pair<int,int>
#define LL long long
using namespace std;
const int maxn=2e5+10;
const int MAX=30;
const int inf=0x3f3f3f3f;   
//head 
vector<int >a[maxn];
int fa[maxn][MAX];
int dep[maxn];
int lg[maxn];
void dfs(int now,int fat)
{
    fa[now][0]=fat;
    dep[now]=dep[fat]+1;
    FOR(i,1,lg[dep[now]])
    {
        fa[now][i]=fa[fa[now][i-1]][i-1];
    }
    for (auto to:a[now]) if (to!=fat)
    {
        dfs(to,now);
    }
}
int lca(int x,int y)
{
    if (dep[y]>dep[x]) swap(x,y);
    while (dep[x]>dep[y])
    {
        x=fa[x][lg[dep[x]-dep[y]]];
    }
    if (x==y) return x;
    PER(i,lg[dep[x]],0) if (fa[x][i]!=fa[y][i])
    {
        x=fa[x][i];
        y=fa[y][i];
    }
    return fa[x][0];
    
}
signed main()
{
    int n;
    scanf("%d",&n);
    FOR(i,1,n)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        a[x].PB(y);
        a[y].PB(x);
    }
    FOR(i,1,n)
    {
        lg[i]=(int)log2(i);
    }
    dfs(1,0);
}

以上是关于LCA的主要内容,如果未能解决你的问题,请参考以下文章

代码源 Div1 - 105#451. Dis(倍增求LCA)

浅谈LCA

代码源 Div1 - 105#451. Dis(倍增求LCA)

LCA

二叉树---最近公共父节点(LCA)

LCA 最近公共祖先