社区讨论

我尽力了,为什么不对?

P3379【模板】最近公共祖先(LCA)参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mi6m3m8o
此快照首次捕获于
2025/11/20 07:06
4 个月前
此快照最后确认于
2025/11/20 07:06
4 个月前
查看原帖
CPP
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#define RG register int
#define SZ 500001
using namespace std;
struct Edge{int to,nxt;}e[SZ];
int Ehead[SZ],Ecnt=1;
void Eadd(int u,int v)
{
    e[Ecnt]=(Edge){v,Ehead[u]};
    Ehead[u]=Ecnt++;
    e[Ecnt]=(Edge){u,Ehead[v]};
    Ehead[v]=Ecnt++;
}
int par[SZ][19],dep[SZ];
void dfs(int rt,int u)
{
    dep[u]=dep[rt]+1;
    par[u][0]=rt;
    for(RG i=1;i<=19;i++)
     par[u][i]=par[par[u][i-1]][i-1];
    for(RG i=Ehead[u];i;i=e[i].nxt)
     if(e[i].to!=rt)
      dfs(u,e[i].to);
}
int LCA(int u,int v)
{
    if(dep[u]>dep[v]) swap(u,v);
    for(RG i=0;i<=19;i++)
     if((dep[v]-dep[u])>>i&1)
      v=par[v][i];
    if(u==v)
     return u;
    for(RG i=19;i>=0;i--)
     if(par[u][i]!=par[v][i])
     {
         u=par[u][i];
         v=par[v][i];
     }
    return par[u][0];
}
int gi();
int n,m,s,u,v;
int main()
{
    n=gi(),m=gi(),s=gi();
    for(RG i=1;i<n;i++)
    {
        u=gi(),v=gi();
        Eadd(u,v);
    }
    dfs(0,s);
    for(RG i=1;i<=m;i++)
    {
        u=gi(),v=gi();
        printf("%d\n",LCA(u,v));
    }
    return 0;
}
int gi()
{
    int x=0,o=1;char ch=getchar();
    while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
    if(ch=='-') o=-1,ch=getchar();
    while('0'<=ch&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return x*o;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...