基本概念
对于有限可重集 ,称 中最大的数为 的瓶颈.(视语境不同也可指最小的数.)有限可重集之间可以定义大小关系:将元素分别从小到大排序,得到一个权值序列,按序列的字典序比较可重集的大小.
对于无向带权连通图 ,若 的一个无环连通子图 包含 的所有顶点,则称 为 的一个生成树. 的边权总和称作生成树的大小, 的边权瓶颈称作生成树的瓶颈, 的边权从小到大排序后得到生成树的边权序列. 对某个图 ,所有生成树中最小的称作最小生成树,瓶颈最小的称作最小瓶颈生成树,边权序列字典序最小的称作最小字典序生成树.
一般地,对于无向带权图 (不一定连通),也可定义相应的生成森林.
最小字典序生成树
对于图 ,设生成树 的边权序列为 ,最小字典序生成树 的边权序列为 ,则 的字典序小于等于 的字典序. 事实上我们有更强的结论: 的每个位置都小于等于 !于是能够推出,对任意 , 让第 大的边取到了最小. 特别地, 让最大的边取到了最小,也就是说,最小字典序生成树都是最小瓶颈生成树. 另外,既然每条边都取到了最小,最小字典序生成树也是最小生成树.(同时最小生成树都是最小字典序生成树,因此这两种生成树等价;这也说明所有最小生成树的边权序列都相同.)
下面我们来证明这个结论. 用反证法,设某个 能使 . 现在在 中只保留前 条边(记为 ),这会形成 个连通块( 为点数),将图 划分成 个点集. 在 的 条边中,至少要有 条边是“跨点集”的(不然 不连通了),根据抽屉原理,至少有一条边是 之一(因为其他的边只有 条),设它是 . 现在把 加进 ,这会在 中形成一个环. 由于 是“跨点集”的(即 的两个端点在 中不连通),环上至少有一条边不属于 ,不妨设它是 ,这里我们有 . 因为 和 都是升序,有 . 于是只要把 删掉,就把 改造成了一棵字典序更小的生成树,这就导出了矛盾.
Kruskal 算法
给定图 ,我们用贪心法求解 的最小字典序生成树. 首先把 中所有边权从小到大排序,依次将这些边加入生成树中. 对于某一条边 ,若加入之后不形成环(即加入前 与 不连通)则加入,否则跳过. 可用并查集维护连通性. 时间复杂度 ,其中 为边数.
这样贪心有一点小问题:如果存在相等的边权,它们加入的先后顺序如何确定呢?事实上,相等的边权无论按什么顺序加入,最后都会得到一棵最小字典序生成树. 这很容易证明:考虑我们即将加入一批边权为 的边. 加入前的图 可能已经连了一些边,我们把每个连通块都看作一个点;考察全体 ,忽略在连通块内部的边(缩点后相当于自环),我们先把其他 都加入 ,然后取新 的一个生成森林即可. 显然,取的边数是确定的. 另外,加入后新形成的连通块会在下一批边加入前缩掉,所以取哪个生成森林对之后的连通性没有影响.
这段分析是重要的. 我们在矩阵树定理的相关问题中还会见到它.
这便是最小生成树的 Kruskal 算法.
最小瓶颈路
对于图 上的一条路径,可定义它的瓶颈为边权的瓶颈(本文中约定为最大值). 对于点 和 , 到 的最小瓶颈路是两点间所有路径中瓶颈最小的. 最小瓶颈路可能有多个,我们通常只希望求出一条来. 下面我们证明:设 是 的一个最小生成树,则 到 在 上的简单路径一定是 上的最小瓶颈路.
用反证法,假设 到 在 上的路径不是最小瓶颈路. 设最小瓶颈为 . 我们把路径上最大的那条边 (根据假设,)删去,这将 分成两个连通块,一个包含 ,另一个包含 . 考虑一条真正的最小瓶颈路,它从 走到 必定会跨过两个连通块,设跨过的这条边为 ,则有 . 现在把 加回 , 就变成了更小的生成树,这就导出了矛盾.
因此,给定图 ,先求一棵最小生成树,再用树上倍增或树剖求路径最值,这就求出了最小瓶颈. 时间复杂度 ,其中 为边数, 为点数, 为询问次数.
Kruskal 重构树
参考 cqy 课件,在此表示感谢.
Kruskal 算法是对生成树性质的充分利用. 有时候我们需要记录算法过程中的某些信息,这需要Kruskal 重构树.
在算法进行过程中,Kruskal 重构树始终是一个森林(若 连通则最后会变成一棵树). 首先建立 个叶子结点,对应图 的 个结点. 接下来进行 Kruskal 算法,按边权升序枚举 的边. 当一条边 被跳过时不做操作,否则查出 、 两点所在树的根 、(此时一定有 ),新建权值为 的结点 ,将 和 设为 的儿子.
这样做的正确性显然,因为在任意时刻,点 和 具有相同的树根当且仅当 和 在 Kruskal 算法中是否已经连通. 事实上,这棵重构树本身类似于一个有边权的并查集(而且可查历史版本). 只需略微调整 Kruskal 算法中的并查集,每次不把 和 直接合并而是把它们都与新根 合并(注意合并方向!),就能快速查出点所在树的根.
下面给出 Kruskal 重构树的一些性质.
- 重构树是一棵有 个叶子的完满二叉树(非叶子节点恰有两个儿子).
注意:整棵重构树有 个结点. 数组要开到 倍.
- 非叶子结点的点权满足大根堆性质(父亲的权值大于等于左右儿子).
- 最小生成树上 到 的简单路径对应于重构树上叶子 到叶子 的简单路径.
这两条性质给出一种新的求最小瓶颈路的方法:在重构树上求两点的最近公共祖先,它的权值即为最小瓶颈.
例题
待续……
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】