1.dfn序
2.欧拉序1
void dfs(int u,int f){
a[++dfk]=u;
for(int i=head[u];i;i=nxt[i])
if(v[i]!=f){
dfs(v[i],u);
a[++dfk]=u;
}
}
rmq求s,t的lca的时候,求它们中in之间的深度最小的点就行了
3.欧拉序2
void dfs(int u,int f){
a[++dfk]=u;
for(int i=head[u];i;i=nxt[i])
if(v[i]!=f){
dfs(v[i],u);
}
a[++dfk]=u;
}
于是每个点会有一个st和ed
若lca(x,y)=x
那么st[x]到st[y]这段区间中,有的点出现了两次,有的点没有出现过,这些点都是对答案没有贡献的,我们只需要统计出现过1次的点就好
若lca(x,y)≠x,此时x,y位于不同的子树内,我们只需要按照上面的方法统计ed[x]到st[y]这段区间内的点。加上特判LCA