跳转至

Tarjan 求LCA

  • 已经访问过的点在当前点子树里,代表元一定是当前点(回溯于此)
  • 已经访问的点不在当前点子树里,代表元一定是当前点祖先(反证法)
  • 已经访问的点的代表元为最近的祖先(反证,若不是则已经回溯到这个点这俩成同一代表元)

欧拉序求LCA

同tarjan,进来记录一次,再次出发记录\(n\)次,出来记录一次,形成一个序列

  • 第一次出现和最后一次出现间的点全部为后代

  • 若不互为祖先:形如\(.lca..a.a.a.a..lca..lca..lca..b.b.b.b..lca.\)\(a\)最后一次出现到\(b\)第一次出现之间会出现一个\(a,b\)的祖先,且只出现一个(不会出现更上一级的祖先因为\(b\)还没遍历)

  • 若互为祖先\(a...a...b...b...a...a\),\(a\)\(b\)之间夹杂的全为\(a\)的后代,深度较深

所以找\([euler_{a_1},euler_{b_1}]\)中的深度最小点即可

二分

\(a\)升高则\(b\)升高,而且\(b\)好判断,于是二分\(a\).

欧拉回路

注意到,一次一直走下去一定是一条回路的性质,然后在回溯中可以拆为多条回路然后靠回溯拼接起来

  • 一次小回溯结束是一条回路
  • 每个大回溯主分支是回路但有多个小回溯分支
  • 当大回溯时:大回溯前半+小回溯路径+大回溯后半
  • 大回溯也是一条回路
  • 保证每个回溯都是一条回路最后合并到一条回路上
  • 这条回路为欧拉回路

无向图和有向图均适应

半欧拉图的欧拉路径

  • 第一次走的分支就能从起点走到终点(反证法)
  • 之后从中延申出来的都是环了(因为此时无奇数点)
  • 合并进去
  • 依旧回溯得到欧拉路径

无向图有向图均适用

关于单调栈和单调队列

将之后不可能作为答案的元素pop,然后刚好可以有符合答案的元素。