社区讨论
70分RE蒟蒻求助大佬
P3379【模板】最近公共祖先(LCA)参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mi7rpxxf
- 此快照首次捕获于
- 2025/11/21 02:31 4 个月前
- 此快照最后确认于
- 2025/11/21 02:31 4 个月前
CPP
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn1 500005
using namespace std;
int n,m,s;
int a,b;
int u,v;
int sum=0;
int depth[maxn1];
int f[maxn1][25];
int go[maxn1],first[maxn1],next[maxn1];
int maxx(int a,int b){
return a>b?a:b;
}
void read(int &x){
char temp;
while(temp=getchar()){
if(temp>='0'&&temp<='9'){
x=temp-'0';
break;
}
}
while(temp=getchar()){
if(temp<'0'||temp>'9'){
break;
}
x=x*10+temp-'0';
}
return ;
}
void init(){
memset(f,0,sizeof(f));
memset(go,0,sizeof(go));
memset(next,0,sizeof(next));
memset(first,0,sizeof(first));
memset(depth,0,sizeof(depth));
return ;
}
void add(int a,int b){
sum++;
next[sum]=first[a];
first[a]=sum;
go[sum]=b;
return ;
}
void preprocessing(int x,int fath){
int i;
depth[x]=depth[fath]+1;
for(i=1;i<=24;i++){
f[x][i]=f[f[x][i-1]][i-1];
}
for(i=first[x];i;i=next[i]){
if(go[i]!=fath){
f[go[i]][0]=x;
preprocessing(go[i],x);
}
}
return ;
}
int lca(int x,int y){
int i;
if(depth[x]<depth[y]){
swap(x,y);
}
for(i=24;i>=0;i--){
if(depth[f[x][i]]>=depth[y]){
x=f[x][i];
}
if(x==y){
return x;
}
}
for(i=24;i>=0;i--){
if(f[x][i]!=f[y][i]){
x=f[x][i];
y=f[y][i];
}
}
return f[x][0];
}
int main(){
int i;
init();
read(n);
read(m);
read(s);
for(i=1;i<=n-1;i++){
read(a);
read(b);
add(a,b);
add(b,a);
}
preprocessing(s,0);
for(i=1;i<=m;i++){
read(u);
read(v);
printf("%d\n",lca(u,v));
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...