LCA(最近公共祖先模板)

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10; 
vector<int>G[N];
int fa[N][23],dep[N],n,m;
void dfs(int u,int f,int d)
{
	fa[u][0]=f;
	dep[u]=d;
	for(int i=0;i<G[u].size();i++)
	{
		int v=G[u][i];
		if(v==f) continue;
		dfs(v,u,d+1);
	}
}
void init()
{
	dfs(1,0,1);
	for(int k=1;k<=20;k++)
	for(int i=1;i<=n;i++)
	fa[i][k]=fa[fa[i][k-1]][k-1];
}
int lca(int u,int v)
{
	if(dep[v]<dep[u]) swap(u,v);
	for(int k=20;k>=0;k--)
		if(dep[fa[v][k]]>=dep[u]) v=fa[v][k];
	if(u==v) return v;
	for(int k=20;k>=0;k--)
		if(fa[v][k]!=fa[u][k]) v=fa[v][k],u=fa[u][k];
	return fa[v][0];
}
int main()
{
	int u,v;
	cin>>n>>m;
	for(int i=1;i<n;i++) 
	{
		scanf("%d%d",&u,&v);
		G[u].push_back(v);
		G[v].push_back(u);
	}
	init();
	while(m--)
	{
		scanf("%d%d",&u,&v);
		int f=lca(u,v);
		printf("%d\n",f);
	}
}

猜你喜欢

转载自blog.csdn.net/qq_41286356/article/details/89500917
今日推荐