相关笔记

概览

本节介绍最小生成树(Minimum Spanning Tree, MST)问题的基本理论框架。核心思想是:通过(cut)与轻量边(light edge)的概念,建立安全边定理(Theorem 21.1),为贪心策略提供严格的数学基础。在此基础上给出通用MST算法(GENERIC-MST)的伪代码与正确性证明。

要点列表:

  • MST 问题要求在连通无向图中找到一棵权值之和最小的生成树
  • 将顶点集划分为两个非空子集,轻量边是穿过割的最小权边
  • 安全边定理是所有MST算法的理论基石:轻量边一定是安全边
  • GENERIC-MST 通过不断添加安全边来”生长”MST,其正确性由循环不变式保证
  • 推论 21.2(环性质)与推论 21.3(割性质)是安全边定理的重要推论

知识结构总览

flowchart TD
    A["21.1 生长最小生成树"] --> B["问题定义"]
    A --> C["核心概念"]
    A --> D["理论基础"]
    A --> E["通用算法"]

    B --> B1["连通无向图 G=(V,E)"]
    B --> B2["权函数 w: E → R"]
    B --> B3["目标: 最小化 w(T)"]

    C --> C1["割 (S, V-S)"]
    C --> C2["轻量边 (Light Edge)"]
    C --> C3["尊重割 (Respects a Cut)"]
    C --> C4["安全边 (Safe Edge)"]

    D --> D1["定理 21.1: 安全边定理"]
    D --> D2["推论 21.2: 环性质"]
    D --> D3["推论 21.3: 割性质"]

    E --> E1["GENERIC-MST 伪代码"]
    E --> E2["循环不变式证明"]
    E --> E3["→ Kruskal 算法"]
    E --> E4["→ Prim 算法"]

核心思想

核心思路

MST问题的贪心策略可以用一句话概括:每一步都选择不会”犯错误”的边加入当前集合。所谓”不会犯错误”,就是加入这条边后,当前边集仍然是某棵MST的子集。安全边定理保证了:只要选择穿过某个割的轻量边,就一定不会犯错误。GENERIC-MST算法正是基于这一原理,不断找到安全边并加入集合,直到形成完整的MST。

2.1 最小生成树问题定义

最小生成树(Minimum Spanning Tree)

给定一个连通无向图 和一个权函数 的一棵生成树(spanning tree)是 的一个连通无环子图 ,其中 。生成树的权值定义为:

如果 的所有生成树中权值最小的一棵,即对所有生成树 都有 ,则称 的一棵最小生成树(Minimum Spanning Tree, MST)。

直观理解: 想象你要用最低成本修建道路将所有城市连通。每条可能的道路有一个修建成本(边权),生成树保证所有城市连通且没有冗余道路(无环),最小生成树则保证总成本最低。

生成树的基本性质:

  • 一棵生成树恰好有 条边
  • 去掉生成树中任意一条边,图将不再连通
  • 给生成树中任意两个不相邻的顶点之间添加一条边,将恰好产生一个环

2.2 割(Cut)

割(Cut)

无向图 的一个 是顶点集 的一个划分,将 分为两个非空子集

如果一条边 的一个端点在 中、另一个端点在 中,则称该边穿过(crosses)割

直观理解: 割就像是在地图上画一条线,把所有城市分成两组。穿过割的边就是连接这两组城市的道路。

2.3 轻量边(Light Edge)

轻量边(Light Edge)

穿过割 的边中,权值最小的边称为该割的轻量边。如果有多条权值相同的最小权边,则它们都是轻量边。

注意: 轻量边是相对于某个特定割而言的。同一条边可能是某个割的轻量边,但不是另一个割的轻量边。

2.4 尊重割(Respects a Cut)

尊重割(Respects a Cut)

是一个边集。如果 中没有任何边穿过割 ,则称割 尊重边集

直观理解: “尊重”意味着割的两边之间没有已经被选中的边,即 中的边要么完全在 内部,要么完全在 内部。

2.5 安全边(Safe Edge)

安全边(Safe Edge)

的一个子集,且 包含在某棵 MST 中。如果边 满足 也包含在某棵 MST 中,则称 安全边

直观理解: 安全边就是”加入后不会犯错误”的边——加入它之后,当前边集仍然是某棵最小生成树的子集。MST贪心算法的核心就是每次都选择安全边。

2.6 定理 21.1(安全边定理)

定理 21.1(安全边定理 / Theorem 21.1)

是一个连通无向图, 是包含在某棵 MST 中的边集,尊重 的任意割, 是穿过割 的一条轻量边。则边 安全的

2.7 推论 21.2(环性质)

推论 21.2(环性质 / Cycle Property)

是连通图 中关于边集 的一个(即 中的边加上边 后形成的环),且 中权值唯一最大的边。则 不属于任何包含 的 MST。

2.8 推论 21.3(割性质)

推论 21.3(割性质 / Cut Property)

是连通图 的任意割, 是穿过该割的唯一最小权边。则 属于某棵 MST。

2.9 GENERIC-MST 伪代码

算法执行流程

  1. 初始化边集 A 为空集
  2. while A 尚未形成生成树(边数 < |V|-1 或顶点未全部连通)
  3. 找一条安全边 (u, v)——即横跨割 (A, V-A) 的最小权边
  4. 将安全边 (u, v) 加入 A
  5. 循环结束时返回 A,A 即为一棵最小生成树
flowchart TD
    A["开始:输入图 G, 权值函数 w"] --> B["A = 空集"]
    B --> C{"A 是否形成生成树?"}
    C -- 否 --> D["寻找安全边 (u, v)<br/>横跨割的最小权边"]
    D --> E["A = A ∪ {(u, v)}"]
    E --> C
    C -- 是 --> F["返回 A<br/>A 即为最小生成树"]
GENERIC-MST(G, w)
1  A ← ∅
2  while A does not form a spanning tree
3      find an edge (u, v) that is safe for A
4      A ← A ∪ {(u, v)}
5  return A

算法说明:

  • 第1行初始化边集 为空集
  • 第2-4行的 while 循环不断寻找 的安全边并加入
  • 形成生成树时循环终止(此时 条边且连通所有顶点)
  • 第5行返回的就是一棵 MST

关键观察

在 while 循环的每次迭代中, 始终是某棵MST的子集。循环开始时 ,显然满足这一性质。每次加入安全边后,该性质仍然保持。当循环结束时, 形成生成树且是某棵MST的子集,因此 本身就是一棵MST。

2.10 GENERIC-MST 正确性证明

循环不变式

在 while 循环(第2-4行)每次迭代开始时:

  • 是某棵 MST 的子集

初始化(Initialization):

是任何 MST 的子集,循环不变式平凡成立】

  • 在第一次迭代之前,
  • 空集是任何 MST 的子集(因为空集不排除任何边)
  • 循环不变式成立

维护(Maintenance):

【安全边定义保证 仍是某 MST 的子集】

  • 由循环不变式,在当前迭代开始时 是某棵 MST(设为 )的子集
  • 第3行找到一条安全边
  • 由安全边的定义, 也包含在某棵 MST 中
  • 第4行将 加入
  • 因此在下次迭代开始时,新的 仍然是某棵 MST 的子集
  • 循环不变式得到维护

终止(Termination):

是生成树且是 MST 子集,故 本身就是 MST】

  • 循环在 形成生成树时终止
  • 由循环不变式, 是某棵 MST 的子集
  • 本身是一棵生成树,且是某棵 MST 的子集
  • 因此 本身就是一棵 MST
  • 算法正确性得证

关于安全边的寻找

GENERIC-MST 本身并没有指定如何高效地找到安全边。这正是 Kruskal 算法和 Prim 算法要解决的问题——它们各自以不同的方式高效地识别安全边:

  • Kruskal 算法:在所有不与 形成环的边中选权值最小的——利用不相交集合数据结构(第19章_用于不相交集合的数据结构-章节汇总)高效判断是否形成环
  • Prim 算法:在所有连接 中树与树外顶点的边中选权值最小的——利用优先队列高效选取最小权边

两种算法的具体实现将在 21.2 Kruskal与Prim算法 中详细介绍。


补充理解与拓展

MST 的发明历史

最小生成树问题有着丰富的历史,可以追溯到20世纪初的欧洲:

人物年份贡献
Otakar Borůvka1926第一个给出MST问题解法,用于优化摩拉维亚地区的电力网络铺设
Vojtěch Jarník1930独立提出了一种MST算法(后来被称为Jarník算法,即Prim算法的先驱)
Joseph Kruskal1956提出了著名的Kruskal算法,发表在《Proceedings of the AMS》上
Robert C. Prim1957提出了Prim算法,最初由Jarník在1930年独立发现

Borůvka的原始问题: 1926年,摩拉维亚(今捷克共和国的一部分)的电力公司希望以最低成本建设电力传输网络,将各个城镇连接到发电站。Borůvka作为Brno大学的数学家,将这个工程问题抽象为图论中的最小生成树问题,并给出了第一个系统性的解决方案。他的论文”O jistém problému minimálním”(On a Certain Minimal Problem)发表在《Práce moravské přírodovědecké společnosti》上。

来源:Nesetril, J. & Nesetrilova, H., “The Origins of Minimal Spanning Tree Algorithms - Borůvka and Jarník”, DMV, 2007; Northeastern University CS2510 Lecture Notes

MST 的实际应用

最小生成树在工程和科学中有广泛的应用:

应用领域具体场景说明
网络设计通信网络、电力网络、管道铺设以最低成本连接所有节点,MST直接给出最优解
聚类分析单连接聚类(Single-linkage clustering)删除MST中最大的 条边,得到 个聚类
近似算法TSP的2倍近似对MST进行前序遍历,跳过重复访问的顶点,得到不超过2倍最优的TSP解
图像分割将像素视为图顶点MST用于识别图像中的区域边界
生物学系统发育树构建用MST近似物种间的进化关系
VLSI设计芯片布线优化最小化芯片上连线总长度

来源:CSDN技术文档; 掘金图算法系列; 51CTO网络优化专题

MST 与贪心策略的关系

MST问题是贪心算法第15章_贪心算法-章节汇总)的经典成功案例。回顾贪心算法的两个核心要素:

  1. 贪心选择性质(Greedy-Choice Property): 可以通过局部最优选择来构造全局最优解。在MST问题中,安全边定理保证了:选择轻量边(局部最优)不会排除全局最优解的存在。
  2. 最优子结构(Optimal Substructure): 问题的最优解包含子问题的最优解。在MST问题中,如果 是安全边,则 的最优扩展就是原问题的最优扩展。

安全边定理本质上就是MST问题的贪心选择性质的严格表述。它告诉我们:不需要考虑所有可能的边,只需要在每一步选择”安全”的边即可。GENERIC-MST框架将这一思想抽象为通用算法,而Kruskal和Prim则分别给出了不同的”安全边选取策略”。

与活动选择问题(15.1 活动选择问题)和哈夫曼编码(15.3 哈夫曼编码)类似,MST的贪心策略之所以有效,是因为问题本身具有特殊的数学结构(割与轻量边的关系),使得局部最优选择不会”锁死”全局最优解。


易混淆点与辨析

误区:MST 包含所有顶点对之间的最短路径

错误理解: “最小生成树是最优的,所以它应该包含图中任意两个顶点之间的最短路径”

正确理解: MST 保证的是所有边的权值之和最小,而不是任意两点间的路径最短。MST 中两个顶点之间的路径可能比原图中的最短路径长得多。

具体例子: 考虑一个三角形图,三个顶点 ,边权为 。MST 包含边 ,总权值为 4。但在 MST 中, 的路径是 ,长度为 4,而原图中 的直接边权值仅为 3。MST 中 的路径(长度4)大于最短路径(长度3)。

区分: 最短路径树(Shortest Path Tree)以某个源点为根,保证从源点到所有其他顶点的路径最短;MST 则保证所有边的总权值最小。两者是不同的优化目标。

误区:安全边就是轻量边

错误理解: “安全边和轻量边是同一个概念”

正确理解: 轻量边和安全边是不同层次的概念:

  • 轻量边是相对于某个而言的:穿过该割的最小权边
  • 安全边是相对于某个边集 而言的:加入 后仍属于某棵 MST 的边

关系: 定理 21.1 说明:如果 是尊重 的某个割的轻量边,则 是安全的。即轻量边一定是安全边(在尊重 的割中)。

但反过来不成立! 安全边不一定是轻量边。习题 21.1-2 给出了反例:安全边可以不是任何割的轻量边。安全边的定义更宽泛,它只要求加入后不破坏”属于某棵MST”的性质。

误区:MST 可以直接应用于有向图

错误理解: “MST算法可以处理有向图,只需要把有向边当作无向边处理”

正确理解: MST 问题只对无向图有定义。有向图中的对应问题是”最小生成树形图”(Minimum Spanning Arborescence),也称为”最小有向生成树”,由 Edmonds(1967)提出了解法(Chu-Liu/Edmonds 算法)。这是一个不同的问题,不能简单地用无向图的MST算法解决。

原因: 在有向图中,“生成树”的概念需要指定根节点,且边的方向使得连通性的定义发生变化。有向图中的最小树形图问题比无向图的MST问题更复杂。

误区:所有边权不同时MST一定唯一

错误理解: “只要所有边权不同,MST就一定唯一”

正确理解: 这个说法是正确的——当图中所有边权互不相同时,MST是唯一的。但习题 21.1-6 表明,反过来不成立:即使存在权值相同的边,MST也可能是唯一的。

唯一性的充分条件(非必要): 所有边权不同 MST唯一。

反例(唯一MST但存在等权边): 三角形图 ,边权 。唯一MST包含边 ,总权值为2。但割 有两条等权轻量边 ,说明并非每个割都有唯一轻量边。


习题精选

题号题目描述难度来源
21.1-1 是连通图 中的一条最小权边,证明 属于 的某棵 MSTCLRS
21.1-2Sabatier教授猜想安全边一定是轻量边,给出反例反驳⭐⭐CLRS
21.1-3证明若边 属于某棵MST,则它是某个割的轻量边⭐⭐CLRS
21.1-4给出一个连通图的例子,使得所有”某个割的轻量边”的集合不构成MST⭐⭐CLRS
21.1-5 是连通图 某个环上的最大权边,证明存在一棵不含 的MST⭐⭐CLRS

视频学习指南

资源主题链接说明
MIT 6.006 Lecture 12Minimum Spanning Trees待补充MST基础理论与Prim算法
Abdul BariPrim’s Algorithm待补充逐步动画演示
Abdul BariKruskal’s Algorithm待补充逐步动画演示
WilliamFisetMST Introduction待补充MST系列入门
3Blue1BrownSpanning Trees待补充可视化直觉理解

教材原文

CLRS 第4版 21.1节——最小生成树问题定义

In this chapter, we shall examine algorithms for finding a minimum spanning tree of an undirected graph. Given a connected, undirected graph with a weight function , we wish to find an acyclic subset that connects all of the vertices and whose total weight is minimized. Since is acyclic and connects all vertices, it must form a tree, which we call a spanning tree because it spans the graph . We call the problem of determining the tree the minimum-spanning-tree problem.

CLRS 第4版 21.1节——割与安全边的定义

We define a cut of an undirected graph as any partition of into two nonempty sets and . An edge crosses the cut if one of its endpoints is in and the other is in . We say that a cut respects a set of edges if no edge in crosses the cut. An edge is a light edge crossing a cut if its weight is the minimum of any edge crossing the cut. Note that there can be more than one light edge crossing a cut in the case of ties. More generally, we say that an edge is a light edge satisfying a given property if it has the minimum weight of any edge satisfying the property.

CLRS 第4版 21.1节——安全边的定义

When we say that an edge is a safe edge for a set of edges, we mean that is a subset of some MST.

CLRS 第4版 21.1节——定理 21.1(安全边定理)

Let be a connected, undirected graph with a real-valued weight function defined on . Let be a subset of that is included in some minimum spanning tree for , let be any cut of that respects , and let be a light edge crossing . Then, edge is safe for .

CLRS 第4版 21.1节——GENERIC-MST

We can use the loop invariant shown in Figure 21.1 to show that the generic algorithm returns a minimum spanning tree.

Loop Invariant: is a subset of some minimum spanning tree.

Initialization: After line 1, the set is empty, and it is trivially a subset of any minimum spanning tree.

Maintenance: The loop in lines 2-4 maintains the invariant by adding only safe edges.

Termination: The set is a spanning tree by the termination condition, and it is a subset of some minimum spanning tree by the invariant. Since any spanning tree that is a subset of a minimum spanning tree must itself be a minimum spanning tree, is a minimum spanning tree.


参见Wiki

概念页尚未创建

第21章-最小生成树 生长最小生成树