当前位置 : 主页 > 手机开发 > ROM >

倍增求LCA

来源:互联网 收集:自由互联 发布时间:2021-06-10
#includebits/stdc++.hstruct node{ int from,to,next;}edge[1000001];int n,m,s,head[1000001],num,depth[1000001],father[1000001][50];void add(int u,int v){ edge[++num].from=u; edge[num].to=v; edge[num].next=head[u]; head[u]=num; return;}void De
#include<bits/stdc++.h>
struct node
{
    int from,to,next;
}edge[1000001];
int n,m,s,head[1000001],num,depth[1000001],father[1000001][50];
void add(int u,int v)
{
    edge[++num].from=u;
    edge[num].to=v;
    edge[num].next=head[u];
    head[u]=num;
    return;
}

void Depth_First_Search(int now,int dep,int last)
{
    for(int i=head[now];i;i=edge[i].next)
        if(edge[i].to-last)
        {
            depth[edge[i].to]=dep+1;
            father[edge[i].to][0]=now;
            for(int j=1;(1<<j)<=depth[edge[i].to];j++)
                father[edge[i].to][j]=father[father[edge[i].to][j-1]][j-1];
            Depth_First_Search(edge[i].to,dep+1,now);
        }
        
    return;
}

int lca(int x,int y)
{
    if(depth[x]<depth[y])
        x^=y^=x^=y;
    while(depth[x]>depth[y])
        x=father[x][int(log2(depth[x]-depth[y]))];
    if(x==y)
        return x;
    for(int i=log2(depth[x]);i>=0;i--)
        if(father[x][i]-father[y][i])
        {
            x=father[x][i];
            y=father[y][i];
        }
        
    return father[x][0];
}

int main()
{
    scanf("%d%d%d",&n,&m,&s);
    for(int i=1;i<=n-1;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        add(x,y);
        add(y,x);
    }
    
    Depth_First_Search(s,0,0);
    for(int i=1;i<=m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        printf("%d\n",lca(x,y));
    }
    
    return 0;
}
网友评论