一個優秀的求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;
}
}
}