算法学习笔记(10):各种序的美好性质
dfs序
定义
dfs序是指:每个节点在dfs深度优先遍历中的进出栈的时间序列。
序列
树上路径
任意子树都是连续的。例如假设有个子树\(BEFK\),在序列中对应的部分是:\(BEEFKKFB\);子树 \(CGHI\) ,在序列中对应的部分是:\(CGGHHIIC\) 。
任意点对 \((a,b)\) 之间的路径,可分为两种情况,首先是令 \(lca\) 是 \(a、b\) 的最近公共祖先:
1.若 \(lca\) 是 \(a、b\) 之一,则 \(a、b\) 之间的 \(in\) 时刻的区间或者 \(out\) 时刻区间就是其路径。例如\(AK\)之间的路径就对应区间 \(ABEEFK\) 或者 \(KFBCGGHHIICA\)。
2.若 \(lca\) 另有其人,则a、b之间的路径为 \(In[a]、Out[b]\) 之间的区间或者\(In[b]、Out[a]\) 之间的区间。另外,还需额外加上lca!!!考虑 \(EK\) 路径,对应为\(EFK\)再加上 \(B\) 。考虑 \(EH\) 之间的路径,对应为 \(EFKKFBCGGH\) 再加上 \(A\) 。
考虑这些性质, 可以用dfs序做树上括号序莫队。
子树
性质: 以 \(u\) 为根的子树de所有的节点, 在dfs序中是连续的一段。
应用: 可以利用dfs序和差分, 将路径加, 单点查问题转化成单点加, 子树和问题。
同时子树和可以转化成序列区间问题, 这样就可以上数据结构了。
链
最经典的应用就是树链剖分, 优先访问重链, 使重链在dfs序中为连续的一段, 从而通过数据结构可以维护整棵树的信息。
树
dfs序对于树本身也有很多美好性质。
极小生成子树(自己命名的)
给定一些关键点, 我们怎么得到最小的包括所有关键点的子树的信息呢。
将每个关键点按 \(dfs\)序排序, 得到\(a[k]\)数组。
这颗子树的边权和 $sum = ((\sum dis(a[i], a[i - 1])) + dis(a[1], a[k])) / 2 $
这里的 \(dis\) 仅仅是一个例子, 还可以改成各种想维护的信息。
虚树: 实际上就是建出极小生成子树, 将相邻两点的 \(lca\) 加入序列, 去重后, 根据父子关系建树即可。
欧拉序
定义:进入节点时记录,每次遍历完一个子节点时,返回到此节点记录,得到的 2 ∗ N − 1 长的序列;
性质:节点 x 第一次出现与最后一次出现的位置之间的节点均为 x 的子节点;
任意两个节点的 LCA 是欧拉序中两节点第一次出现位置中深度最小的节点。两个节点第一次出现的位置之间一定有它们的LCA,并且,这个LCA一定是这个区间中深度最小的点。
所以欧拉序可以做到 \(O(nlogn)\) 预处理, \(O(1)\)查询 \(lca\);

浙公网安备 33010602011771号