算法学习笔记(10):各种序的美好性质

dfs序

定义

dfs序是指:每个节点在dfs深度优先遍历中的进出栈的时间序列。

序列

树上路径

任意子树都是连续的。例如假设有个子树BEFK,在序列中对应的部分是:BEEFKKFB;子树 CGHI ,在序列中对应的部分是:CGGHHIIC
任意点对 (a,b) 之间的路径,可分为两种情况,首先是令 lcaab 的最近公共祖先:
1.若 lcaab 之一,则 ab 之间的 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=((dis(a[i],a[i1]))+dis(a[1],a[k]))/2
这里的 dis 仅仅是一个例子, 还可以改成各种想维护的信息。

虚树: 实际上就是建出极小生成子树, 将相邻两点的 lca 加入序列, 去重后, 根据父子关系建树即可。

欧拉序

定义:进入节点时记录,每次遍历完一个子节点时,返回到此节点记录,得到的 2 ∗ N − 1 长的序列;

性质:节点 x 第一次出现与最后一次出现的位置之间的节点均为 x 的子节点;
任意两个节点的 LCA 是欧拉序中两节点第一次出现位置中深度最小的节点。两个节点第一次出现的位置之间一定有它们的LCA,并且,这个LCA一定是这个区间中深度最小的点。
所以欧拉序可以做到 O(nlogn) 预处理, O(1)查询 lca;

posted @   qqrj  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示