社区讨论
我尽力了,为什么不对?
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 条回复,欢迎继续交流。
正在加载回复...