倍增 70pts 求助
查看原帖
倍增 70pts 求助
374433
ppip嘟嘟嘟楼主2021/8/11 16:04
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
const int MAXN=5e5+5;
const int MAX_LOG=19;
int f[MAXN][MAX_LOG+1];
int dep[MAXN];
int head[MAXN],nxt[MAXN],e[MAXN];
int cnt;
void add(int a,int b)
{
    e[cnt]=b;
    nxt[cnt]=head[a];
    head[a]=cnt;
    ++cnt;
}
void dfs(int u,int fa);
inline int go(int x,int d);
int LCA(int a,int b)
{
    if (dep[a]<dep[b]) swap(a,b);
    a=go(a,dep[a]-dep[b]);
    if (a==b) return a;
    for (int i=MAX_LOG;i>=0;--i)
    if (f[a][i]!=f[b][i]) a=f[a][i],b=f[b][i];
    return f[a][0];
}
#include <cstring>
int main()
{
    memset(head,-1,sizeof head);
    int n,m,s;
    cin>>n>>m>>s;
    for (int i=1;i<n;++i)
    {
        int a,b;
        scanf("%d %d",&a,&b);
        add(a,b);
        add(b,a);
    }
    dfs(s,0);
    for (int i=1;i<=MAX_LOG;++i)
    for (int a=1;a<=n;++a)
        f[a][i]=f[f[a][i-1]][i-1];
    while (m--)
    {
        int a,b;
        scanf("%d %d",&a,&b);
        printf("%d\n",LCA(a,b));
    }
    return 0;
}
void dfs(int u,int fa)
{
    f[u][0]=fa;
    dep[u]=dep[fa]+1;
    for (int i=head[u];i!=-1;i=nxt[i])
    {
        int v=e[i];
        if (v==fa) continue;
        dfs(v,u);
    }
}
int go(int x,int d)
{
    for (int i=0;d;++i)
    {
        if (d&1) x=f[x][i];
        d>>=1;
    }
    return x;
}
2021/8/11 16:04
加载中...