社区讨论

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 条回复,欢迎继续交流。

正在加载回复...