最近公共祖先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)
 
 
         
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号