萌新求助lca板子
  • 板块学术版
  • 楼主dapanggoule
  • 当前回复5
  • 已保存回复5
  • 发布时间2020/10/30 22:12
  • 上次更新2023/11/5 09:28:07
查看原帖
萌新求助lca板子
115788
dapanggoule楼主2020/10/30 22:12
#include <iostream>

using namespace std;

struct edge
{
    int u,v,next;
}e[1000000];
int n,m,s;
int cnt,head[1000000];
void add(int u,int v)
{
    cnt++;
    e[cnt].u=u;
    e[cnt].v=v;
    e[cnt].next=head[u];
    head[u]=cnt;
}
int d[1000000],st[1000000][32];

void dfs(int fa,int x)
{
    d[x]=d[fa]+1;
    st[x][0]=fa;
    for(int i=head[x];i;i=e[i].next)
    {
        if(e[i].v!=fa)
        {
            dfs(x,e[i].v);
        }
    }
}

void make()
{
    int i,j,k;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=30;j++)
        {
            st[i][j]=st[st[i][j-1]][j-1];
        }
    }
}
///开始
int query(int a,int b)
{
    int i,j,k;
    if(d[a]<d[b])swap(a,b);
    ///跳平齐
    for(i=30;i>=0;i--)
    {
        if(d[st[a][i]]>d[b])
        {
            a=st[a][i];
        }
    }
    if(d[a]!=d[b])
    {
        a=st[a][0];
    }
    ///找爸爸
    if(a!=b)
    {
        for(i=30;i>=0;i--)
        {
            if(d[st[a][i]]!=d[st[b][i]])
            {
                a=st[a][i];
                b=st[b][i];
            }
        }
        a=st[a][0];
        b=st[b][0];
    }
    return a;
}
///结束






int main()
{
    int i,j,k;
    cin>>n>>m>>s;
    for(i=1;i<n;i++)
    {
        int u,v;
        cin>>u>>v;
        add(u,v);
        add(v,u);
    }
    d[0]=0;
    dfs(s,0);
    make();
    for(int i=1;i<=m;i++)
    {
        int a,b;
        cin>>a>>b;
        if(query(a,b)==0)cout<<1<<endl;
        else cout<<query(a,b)<<endl;
    }
    return 0;
}

样例输出

4

4

1

4

1

正确为

4

4

1

4

4 谢谢大佬蒟蒻感激不尽

2020/10/30 22:12
加载中...