一个优秀的求2点lca的离线算法
把所有询问用前向星储存
然后当dfs到x时,如果存在一个询问(x,y)使得两个点都被访问过,那么就将y的父亲跳上去,直到不能跳为止,这个点就是它们的lca
(等dfs某个点后再规定他的父亲)
否则就标记
跳父亲可用并查集的路径压缩
void dfs1(int x1)
{
int i,y;
bz[x1]=false;
for (i=last2[x1];i>0;i=next2[i])
{
y=tov2[i];
if (!bz[y])
{
ans[len2[i]]=getfather(y);//求答案
}
}
for (i=last1[x1];i>0;i=next1[i])
{
y=tov1[i];
if (bz[y])
{
dep[y]=dep[x1]+1;
dfs1(y);
fa[y]=getfather(x1);//定义父亲
father[y]=x1;
}
}
}