P3379 【模板】最近公共祖先——(倍增)

总结

** 模板题,照着练练手,要开启O2优化,不然TLE**

const int N=5e5+5;
int h[N],dp[N][21];
vector<int>G[N];
void dfs(int x)
{
    for(int i=0;i<G[x].size();i++)
    {
        int v=G[x][i];
        if(v==dp[x][0])
            continue;
        h[v]=h[x]+1;
        dp[v][0]=x;
        dfs(v);
    }
}
int lca(int x,int y)
{
    if(h[x]<h[y])
        swap(x,y);
    for(int i=20;i>=0;i--)
        if(h[x]-h[y]>>i)
            x=dp[x][i];
    if(x==y)
        return x;
    for(int i=20;i>=0;i--)
        if(dp[x][i]!=dp[y][i])
            x=dp[x][i],y=dp[y][i];
    return dp[x][0];
}
signed main()
{
    IOS;
    file();
    int n,m,k;
    cin>>n>>m>>k;
    for(int i=1;i<n;i++)
    {
        int x,y;
        cin>>x>>y;
        G[x].pb(y);
        G[y].pb(x);
    }
    dfs(k);
    for(int i=1;i<=20;i++)
    {
        for(int j=1;j<=n;j++)
            dp[j][i]=dp[ dp[j][i-1] ][i-1];
    }
    while(m--)
    {
        int x,y;
        cin>>x>>y;
        cout<<lca(x,y)<<endl;
    }
    return 0;
}
发布了130 篇原创文章 · 获赞 5 · 访问量 4979

猜你喜欢

转载自blog.csdn.net/weixin_44224825/article/details/104399635