加载中...

欧拉序与dfn序

与 dfn 序的区别:在 dfs 回溯时,把回溯结点也添加到序列中。

欧拉序中每个结点首次出现的顺序就是 dfn 序

eg:
pZXXKnf.png

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

原理与欧拉序一致,只是实现细节上有一点点小出入:

  1. 查询区间为 \([\min(dfn_{u}, dfn_{v})+1, \max(dfn_{u}, dfn_{v})]\)。注意 \(u=v\) 时特判。
  2. 最终答案为倍增表查询得到的点的父亲

pZXXtcq.png

posted @ 2026-02-21 10:59  小橘奏  阅读(29)  评论(0)    收藏  举报