社区讨论

鸭蛋代码求调

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@lrczc0oh
此快照首次捕获于
2024/01/14 12:11
2 年前
此快照最后确认于
2024/01/14 15:02
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
const int N = 5e5+10;
int n,m,s,x,y,a,b;
int cnt,head[N],f[N],used[N],dep[N];
struct node{
	int u,v,nex;
}edge[N*2];
void add(int u,int v){
	edge[++cnt].u=u;
	edge[cnt].v=v;
	edge[cnt].nex=head[u];
	head[u]=cnt;
}
void Change(int now,int pre){
	f[now]=pre;
	used[now]=1;
	for(int i=head[now];i;i=edge[i].nex){
		int to=edge[i].v;
		if(used[to]) continue;
		Change(to,now);
		used[to]=0;
	}
}
void dfs(int root){
	for(int i=1;i<=n;i++){
		int tmp=i;
		while(tmp!=-1){
			tmp=f[tmp];
			dep[i]++;
		}
	}
}
int LCA(int a,int b){
	if(a==b) return a;
	int depa=dep[a],depb=dep[b];
	if(depa==0) return a;
	if(depb==0) return b;
	for(int i=1;i<=depb;i++){
		for(int j=1;j<=i;j++){
			b=f[b];
		}
		for(int j=1;j<=depa;j++){
			a=f[a];
			if(a==b) return b;
		}
	}
}
int main(){
	cin>>n>>m>>s;
	for(int i=1;i<=n-1;i++)
		cin>>x>>y;
		add(x,y);
		add(y,x);
	}
	Change(s,-1);
	for(int i=1;i<=n;i++) used[i]=0;
	dfs(1);
	for(int i=1;i<=n;i++) dep[i]--;//深度 
	for(int i=1;i<=m;i++){
		cin>>a>>b;
		cout<<LCA(a,b)<<endl;
	}
	return 0;
}

回复

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

正在加载回复...