欧拉序与dfn序
与 dfn 序的区别:在 dfs 回溯时,把回溯结点也添加到序列中。
欧拉序中每个结点首次出现的顺序就是 dfn 序
O(1) 查询任意两个结点的 lca
欧拉序求 lca
利用欧拉序结合倍增表,可以在 \(O(n\log n)\) 预处理后做到 \(O(1)\) 查询任意两点 \(lca\)。
具体地,查询 \(u,v\) 两点的 \(lca\):先找到两点在欧拉序中第一次出现的位置(可预处理得到),然后查询两个位置构成区间中深度最小的点,即为 \(lca(u, v)\)。
显然 dfn 序做不到这样,因为 \(lca(u, v)\) 在 dfs 回溯时不会在 dfn 序中留下痕迹,而在欧拉序中可以。
正确性证明可以自己画棵树手玩一下。
于是问题变成了一个不带修的区间最值查询,可类似于 ST 表作倍增预处理,进而做到 \(O(1)\) 查询。
dfn 序求 lca
原理与欧拉序一致,只是实现细节上有一点点小出入:
- 查询区间为 \([\min(dfn_{u}, dfn_{v})+1, \max(dfn_{u}, dfn_{v})]\)。注意 \(u=v\) 时特判。
- 最终答案为倍增表查询得到的点的父亲



浙公网安备 33010602011771号