求助 LCA倍增
  • 板块学术版
  • 楼主B1ade_
  • 当前回复1
  • 已保存回复1
  • 发布时间2021/9/30 13:11
  • 上次更新2023/11/4 05:19:48
查看原帖
求助 LCA倍增
158878
B1ade_楼主2021/9/30 13:11

貌似是dfs出了问题(调了好几天了) code:

#include<bits/stdc++.h>
using namespace std;
struct Edge
{
    int to,next;
}e[500001];
int n,m,s;
int dep[500001],head[500001],fa[500001][21],tot=0;
void add(int u,int v)
{
    e[++tot].to=v;
    e[tot].next=head[u];
    head[u]=tot;
}
void dfs(int p,int f)
{
    if (p==0) return;
    dep[p]=dep[f]+1;
    fa[p][0]=f;
    for (int i=1;(1<<i)<=dep[p];i++) fa[p][i]=fa[fa[p][i-1]][i-1];
    for (int i=head[p];i;i=e[i].next) if(e[i].to!=f) dfs(e[i].to,p);
}
int lca(int x,int y)
{
    if (dep[y]<dep[x]) swap(x,y);
    int t=20;
     while (dep[x]<dep[y])
    {
        if (dep[x]+(1<<t)<=dep[y])
            x=fa[x][t];
        t--;
    }
    if (x==y) return y;
    for (int i=20;i>=0;--i)
    {
        if (fa[x][i]!=fa[y][i])
        {
            x=fa[x][i];
            y=fa[y][i];
        }
    }
    return fa[x][0];
}
int main()
{
    cin>>n>>m>>s;
    for (int i=1;i<=n-1;++i)
    {
        int u,v;cin>>u>>v;
        add(u,v);
        add(v,u);
    }
    dfs(s,0);
    for (int i=1;i<=m;++i)
    {
        int x,y;cin>>x>>y;
        cout<<lca(x,y)<<endl;
    }
    return 0;
}
2021/9/30 13:11
加载中...