蒟蒻LCA模板求调!
查看原帖
蒟蒻LCA模板求调!
494192
ChickenDrinkingMilk楼主2023/1/3 20:28
#include<iostream>
#include<algorithm>
using namespace std;
const int N=5000000;
struct node{
	int to,nxt;
}edge[2*N+5];
int n,t,root,head[N+5],cnt,depth[N+5],fa[N+5][20];
void add(int u,int v){
	edge[++cnt].to=v;
	edge[cnt].nxt=head[u];
	head[u]=cnt;
}
void dfs(int now,int fath){
	depth[now]=depth[fath]+1,fa[now][0]=fath;
	for (int i=1;i<=log2(depth[now])+1;i++)//
		fa[now][i]=fa[fa[now][i-1]][i-1];
	for (int i=head[now];i;i=edge[i].nxt)
		if (edge[i].to!=fath) dfs(edge[i].to,now);
}
int LCA(int u,int v){
	if (depth[u]<depth[v]) swap(u,v);
	for (int i=20;i>=0;i--)
		if (depth[v]<=depth[u]-(1<<i)) u=fa[u][i];
	if (u==v) return u;
	for (int i=20;i>=0;i--)
		if (fa[u][i]!=fa[v][i])
			u=fa[u][i],v=fa[v][i];
	return fa[u][0];
}
void test(int k,int fath){
	cout<<k<<' ';
	for (int i=head[k];i;i=edge[i].nxt)
		if (edge[i].to!=fath) test(edge[i].to,k);
}
int main(){
	ios::sync_with_stdio(0);
	cin>>n>>t>>root;
	for (int i=1;i<=n-1;i++){
		int u,v;
		cin>>u>>v;
		add(u,v),add(v,u);
	}
//	test(root,0);cout<<'\n';
	dfs(root,0); 
	while (t--){
		int u,v;
		cin>>u>>v;
		cout<<LCA(u,v)<<'\n';
	}
	return 0;
}

样例未过,有些输出0

2023/1/3 20:28
加载中...