LCA

void sol(int x,int f)//预处理
{
	fa[x][0]=f;
	dep[x]=dep[f]+1;
	per(i,1,16) fa[x][i]=fa[fa[x][i-1]][i-1];
	for(int i=hd[x];i;i=nx[i]) if(to[i]!=f) sol(to[i],x); 
}
int lca(int x,int y)
{
	if(dep[x]<dep[y]) swap(x,y);
	for(int i=16;i>=0;--i) if(dep[fa[x][i]]>=dep[y]) x=fa[x][i];
	if(x==y) return x;
	for(int i=16;i>=0;--i) if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];
	return fa[x][0];
}
posted @ 2023-01-16 13:01  f2021yjm  阅读(9)  评论(0编辑  收藏  举报