最近公共祖先LCA

int LCA(int x,int y)
{
	if(dep[x]<dep[y])
		swap(x,y);
	int d=dep[x]-dep[y];
	for(int p=0,k=1;p<k;p++,k<<=1)
		if(d&k)
			x=f[p][x];
	if(x==y)
		return x;
	for(int i=k-1;i>=0;i--)
	{
		if(f[i][x]==f[i][y])
			continue;
		x=f[i][x];
		y=f[i][y];
	}
	return f[0][x];
}

int main()
{
	for(int j=1;j<k;j++)
		for(int i=1;i<=n;i++)
			f[j][i]=f[j-1][f[j-1][i]];//f[j][i]表示从点i向上跳2^j步 
}

题目推荐
1.P3379【模板】最近公共祖先(LCA)

2.P4281 AHOI2008 紧急集合/聚会

posted on 2020-07-23 20:13  Allen_lml  阅读(115)  评论(0编辑  收藏  举报