LCA板子求调
  • 板块学术版
  • 楼主LOVELL
  • 当前回复10
  • 已保存回复10
  • 发布时间2023/10/11 19:06
  • 上次更新2023/11/2 14:27:13
查看原帖
LCA板子求调
334292
LOVELL楼主2023/10/11 19:06

板子题目链接

#include <bits/stdc++.h>
using namespace std;
int n,m,s;
const int N=5e5+10;
int f[N][21];
int d[N];
void st(){
	for(int j=1;j<=21;j++){
		for(int i=1;i<=n;i++){
			f[i][j]=f[f[i][j-1]][j-1];
		}
	}
}
int head[N],ver[N],ne[N],tot=0;
void add(int u,int v){
	ver[++tot]=v;
	ne[tot]=head[u];
	head[u]=tot;
}
int lca(int x,int y){
	if(d[x]>d[y]){
		swap(x,y);
	}
	for(int i=21;i>=0;i--){
		if(d[f[y][i]]>=d[x]){
			y=f[y][i];
		}
	}
	if(x==y){
		return x;
	}
	for(int i=21;i>=0;i--){
		if(f[y][i]!=f[x][i]){
			x=f[x][i];
			y=f[y][i];
		}
	}
	return f[x][0];
}
bool vis[N];
void dfs(int k,int dis,int fa){
	d[k]=dis;
	vis[k]=1;
	if(fa==0)f[k][0]=k;
	else f[k][0]=fa;
//	cout<<"--";
//	cout<<v[k].size();
	for(int i=head[k];i;i=ne[i]){
		int j=ver[i];
		if(vis[j])continue;
		vis[j]=1;
	//	cout<<k<<"->"<<j<<endl;
		dfs(j,dis+1,k);
	}
	return ;
}
int main(){
	memset(d,0,sizeof d);
	memset(vis,0,sizeof vis);
	cin>>n>>m>>s;
	for(int i=1;i<=n-1;i++){
		int x,y;
		cin>>x>>y;
		add(x,y);
		add(y,x);
	}
	dfs(s,0,0);
	st();
//	for(int i=1;i<=n;i++){
//		cout<<i<<": "<<d[i]<<endl;
//	}
	for(int i=1;i<=m;i++){
		int x,y;
		cin>>x>>y;
		cout<<lca(x,y)<<endl;
	}
	return 0;
}

问题疑似出现在st表?

2023/10/11 19:06
加载中...