社区讨论

LCA求助

学术版参与者 4已保存回复 7

讨论操作

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

当前回复
7 条
当前快照
1 份
快照标识符
@lymasbmc
此快照首次捕获于
2024/07/15 09:20
2 年前
此快照最后确认于
2024/07/15 10:23
2 年前
查看原帖

rt,大佬们为啥我样例后面几个输不出来 (大雾)

CPP
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+100;
int n,m,s;
//int a[N*4];
int pre[N*5];
int k=1;
struct re{
	int to,next;
}a[N*5];
void add(int u,int v){
	a[k].to=v;
	a[k].next=pre[u];
	pre[u]=k;
	k++;

}
int f[N][21];
int deep[N*4];
void dfs(int x){
	for(int i=pre[x];i!=0;i=a[i].next){
		if(a[i].to!=f[x][0]){
			f[a[i].to][0]=x;
			deep[a[i].to]=deep[x]+1;
			dfs(a[i].to);
		}
	}
}
int lca(int x,int y){
	if(deep[x]<deep[y])swap(x,y);
	for(int i=20;i>=0;i--){
		if(deep[x]-i*2>=deep[y]){
			x=f[x][i];
		}
	}
	if(x==y) return x;
	for(int i=20;i>=0;i--){
		if(f[x][i]!=f[y][i]){
			x=f[x][i];
			y=f[y][i];
		}
	}
	return f[x][0];
}
int main(){
	cin>>n>>m>>s;
	for(int i=1;i<n;i++){
		int x,y;
		cin>>x>>y;
		add(x,y);
		add(y,x);
	}
	dfs(s);
	for(int j=1;j<=20;j++){
		for(int i=1;i<=n;i++){
			f[i][j]=f[f[i][j-1]][j-1];
		}
	}
	while(m--){
		int x,y;
		cin>>x>>y;
		cout<<lca(x,y)<<'\n';
	}
	return 0;
}
(悬)拜托了

回复

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

正在加载回复...