首页 > 其他 > 详细

【模板】LCA

时间:2019-11-14 22:48:23      阅读:84      评论:0      收藏:0      [点我收藏+]
#include<bits/stdc++.h>
using namespace std;
int head[2000000],d[500005],lg[500005],fa[500005][25],l,n,m,s,x,y;
struct node {
    int to,next;
} a[2000000];
inline void add(int from,int to) {
    a[++l].to=to;
    a[l].next=head[from];
    head[from]=l;
}
void dfs(int bh,int f)
{
    d[bh]=d[f]+1;
    fa[bh][0]=f;
    for(int i=1;pow(2,i)<=d[bh];i++)
        fa[bh][i]=fa[fa[bh][i-1]][i-1];
    for(int i=head[bh];i;i=a[i].next)
    {
        int y=a[i].to;
        if(y!=f)dfs(y,bh);
    }
}
int lca(int x,int y)
{
    if(d[x]<d[y])swap(x,y);
    while(d[x]>d[y])x=fa[x][lg[d[x]-d[y]]-1];
    if(x==y)return x;
    for(int i=lg[d[x]]-1;i>=0;i--)
        if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
    return fa[x][0];
}
int main()
{
    scanf("%d%d%d",&n,&m,&s);
    for(int i=1;i<n;i++)
    {
        scanf("%d%d",&x,&y);
        add(x,y);
        add(y,x);
    }
    dfs(s,0);
    for(int i=1;i<=n;i++)
        lg[i]=lg[i>>1]+1;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        printf("%d\n",lca(x,y));
    }
    return 0;
}

CSP-S RP++!

【模板】LCA

原文:https://www.cnblogs.com/yige2019/p/11863119.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!