社区讨论

lca求调

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

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@lo2fqs89
此快照首次捕获于
2023/10/23 13:06
2 年前
此快照最后确认于
2023/10/23 13:06
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define N 500005
using namespace std;
int n,m,s;
struct data{
	int to,next;
}e[2*N];int head[N];
int dp[N][22],cnt,deep[N];
void read(int &x){
	char c=getchar(); 
	while(!(c<='9'&&c>='0'))c=getchar();
	while(c<='9'&&c>='0')x=(x<<1)+(x<<3)+(c^48),c=getchar();
}
void add(int x,int y){
	e[++cnt]=(data){y,head[x]};head[x]=cnt;
}
void dfs(int x,int fa){
	deep[x]=deep[fa]+1;
	dp[x][0]=fa;
	for(int i=1;i<=19;i++){
		dp[x][i]=dp[dp[x][i-1]][i-1];
	}
	for(int i=head[x];i;i=e[i].next){
		if(e[i].to!=fa)dfs(e[i].to,x);
	}
}
int lca(int x,int y){
	if(deep[x]<deep[y])swap(x,y);
	for(int i=20;i;i--){
		if(deep[dp[x][i]]>=deep[y])x=dp[x][i];
	}
	if(x==y)return x;
	for(int i=20;i;i--){
		if(dp[x][i]!=dp[y][i]){
			x=dp[x][i];y=dp[y][i];
		}
	}
	return dp[x][0];
}
int main(){
	read(n);read(m);read(s);
	for(int i=1;i<=n-1;i++){
		int x=0,y=0;
		read(x);read(y);
		add(x,y);
		add(y,x);
	}
	dfs(s,0);
	for(int i=1;i<=m;i++){
		int a=0,b=0;
		read(a);read(b);
		printf("%d\n",lca(a,b));
	}
	return 0;
} 

回复

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

正在加载回复...