LCA模板求调
  • 板块灌水区
  • 楼主absolute_value
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/23 14:09
  • 上次更新2024/7/23 14:59:03
查看原帖
LCA模板求调
1067907
absolute_value楼主2024/7/23 14:09

rt

#include<bits/stdc++.h>
using namespace std;
int n=0,m=0,root=0,md=0;
int deep[500001]={0};
int dad[500001][31]={0};
int lg[500001]={0};
vector<int> g[500001];
void dfs(int x,int s) {
	deep[x]=s;
	md=max(deep[x],md);
	for(int i=0;i<g[x].size();i++) {
		int y=g[x][i];
		if(dad[x][0]!=y) {
			dad[y][0]=x;
			dfs(y,s+1);
		}
	}
}
int lca(int x,int y) {
	if(deep[x]<deep[y]) swap(x,y);
	int i=31;
	while(deep[x]!=deep[y]) {
		if((deep[x]-deep[y])&(1<<i)) {
			x=dad[x][i];
		}
		i--;
	}
	for(int i=lg[deep[x]];i>=0;i--) {
		if(x!=y) {
			x=dad[x][i];
			y=dad[y][i];
		}
	}
	return x;
}
int main() {
	cin>>n>>m>>root;
	for(int i=0;i<n-1;i++) {
		int u=0,v=0;
		cin>>u>>v;
		int x=0,y=0;
		g[u].push_back(v);
		g[v].push_back(u);
	}
	dfs(root,0);
	for(int i=1,j=0;i<md;i++) {
		if(i>=(1<<(j+1))) {
			j++;
		}
		lg[i]=j;
	}
	for(int i=1;i<=n;i++) {
		int x=i;
		for(int j=1,k=1;deep[x]>0;j++) {
			x=dad[x][0];
			if(j==(1<<k)) {
				dad[i][k]=x;
				k++;
			}
		}
	}
	for(int i=0;i<m;i++) {
		int u=0,v=0;
		cin>>u>>v;
		int d=lca(u,v);
		cout<<d<<endl;
	}
	return 0;
}
2024/7/23 14:09
加载中...