最近公共祖先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)