ST算法:
预处理每个节点的深度
预处理pow[i]=2^i;
算法是分两步的
1.x,y走到同一深度。
2.x,y要走到同一个点。
预处理一个f数组
f[i][j]表示i点向上走2^j步到达的点是谁
for (int i=1;i<=n;i++)
f[i][0]=pa[i];
for (int j=1;j<=20;j++)
for (int i=1;i<=n;i++)
f[i][j]=f[f[i][j-1]][j-1];
i 向上走 2^j 步
i 走 2^(j-1) 再走 2^(j-1)
f[i][j-1]
for (int k=20;k>=0;k--)
{
xx=f[x][k]; yy=f[y][k];
//if (xx==yy)
if (xx!=yy)
{
x=xx;
y=yy;
}
}
pa[x]=pa[y]=LCA(x, y)
if (dep[x]<dep[y])
swap(x, y)
c=dep[x]-dep[y]; //c就是深度差
for (int k=20;k>=0;k--)
{
if (c>pow[k])
{
x=f[x][k];
c-=pow[k];
}
}
dep: n
f : nlogn
pow: logn
nlogn
q*logn
O(nlogn + qlogn)
LCA ST
最新推荐文章于 2020-12-26 10:40:53 发布