一个平面图和它的最小生成树。在该图中，边的长度正比于权值A。
**最小生成树**（英語：，簡稱**MST**）是**最小權重生成樹**（英語：）的簡稱，是一副连通加权无向图中一棵权值最小的生成树。

在一給定的無向圖 {\displaystyle G=(V,E)} 中，{\displaystyle (u,v)} 代表連接頂點 u 與頂點 v 的邊（即 {\displaystyle (u,v)\in E}），而 {\displaystyle w(u,v)} 代表此邊的權重，若存在 T 為 E 的子集（即 {\displaystyle T\subseteq E}）且 (V, T) 為樹，使得：

{\displaystyle w(T)=\sum \_{(u,v)\in T}w(u,v)}
的 w(T) 最小，則此 T 為 G 的最小生成樹。

一个连通图可能有多个生成树。当图中的边具有权值时，总会有一个生成树的边的权值之和小于或者等于其它生成树的边的权值之和。广义上而言，对于非连通无向图来说，它的每一连通分量同样有最小生成树，它们的并被称为**最小生成森林**。

以有線電視電纜的架設為例，若只能沿著街道佈線，則以街道為邊，而路口為頂點，其中必然有一最小生成樹能使佈線成本最低。

相关性质
----

### 存在个数

这张图表明一个图中可能有多个最小生成树
最小生成树在一些情况下可能会有多个。例如，当图的每一条边的权值都相同时，该图的所有生成树都是最小生成树。

#### 唯一性

如果图的每一条边的权值都互不相同，那么最小生成树将只有一个。这一定理同样适用于最小生成森林。

证明：

> 
> 假设图{\displaystyle G}为每条边权值互不相同的连通图，且有两个不同的最小生成树{\displaystyle T}和{\displaystyle T'}。
> 
> 
> 则{\displaystyle T}中必然存在一些在{\displaystyle T'}中并不存在的边，取其中一条这样的边{\displaystyle e\_{0}}。
> 
> 
> 因为{\displaystyle T'}是最小生成树，所以若往{\displaystyle T'}中添加边{\displaystyle e\_{0}}，则将会出现环路。（因为有{\displaystyle m}个顶点的树有且仅有{\displaystyle m-1}条边）
> 
> 
> 同时可知，如果从{\displaystyle T}中删除边{\displaystyle e\_{0}}，则{\displaystyle T}将分为互不连通的两个连通分量。因为{\displaystyle e\_{0}\notin T'}，所以{\displaystyle T'}中必然有其他的边连接这两个连通分量。且将{\displaystyle e\_{0}}加入{\displaystyle T'}后形成的环路中，除了{\displaystyle e\_{0}}外至少有另一条连接{\displaystyle T}中删除{\displaystyle e\_{0}}后的这两个连通分量的边。取其中一条这样的边，记作{\displaystyle {e\_{0}}'}。此时若将{\displaystyle {e\_{0}}'}加入{\displaystyle T}，则可连接从{\displaystyle T}中删除{\displaystyle e\_{0}}后得到的两个连通分量，并形成一棵不同的生成树。
> 
> 
> 因为{\displaystyle G}中所有边的权值互不相同，所以关于{\displaystyle e\_{0}}和{\displaystyle {e\_{0}}'}的权重大小关系，可能有以下两种情况之一：
> 
> 
> 1. 若{\displaystyle e\_{0}<{e\_{0}}'}，则可从{\displaystyle T'}中删除{\displaystyle {e\_{0}}'}并加入{\displaystyle e\_{0}}，从而得到一棵总权值更小的生成树。这和{\displaystyle T'}是最小生成树相矛盾。
> 2. 若{\displaystyle e\_{0}>{e\_{0}}'}，则可从{\displaystyle T}中删除{\displaystyle e\_{0}}并加入{\displaystyle {e\_{0}}'}，从而得到一棵总权值更小的生成树。同样，这和{\displaystyle T}是最小生成树相矛盾。
> 
> 
> 综上，若{\displaystyle G}各边权重互不相等，则不可能存在两棵互不相同的最小生成树。即{\displaystyle G}的最小生成树是唯一的。
> 
> 
> 

### 边的权值之和最低的子图

如果图的边的权值都为正数，那么最小生成树就是该图的所有包含所有顶点的子图中权值最低的连通子图。

### 环定理

对于连通图中的任意一个环{\displaystyle C}：如果{\displaystyle C}中有边{\displaystyle e}的权值大于该环中任意一个其它的边的权值，那么这个边不会是最小生成树中的边

证明：  

假设{\displaystyle e}属于最小生成树{\displaystyle T1}，那么将{\displaystyle e}删去将会使得{\displaystyle T1}变为两个树。因为环{\displaystyle C}必然还存在另一横切边ｆ可以连接两个子树形成生成树{\displaystyle T2}，且由于{\displaystyle f}＜{\displaystyle e}，生成树{\displaystyle T2}权值更小，与{\displaystyle T1}是最小生成树矛盾。

### 割定理

此图展示了最小生成树的割定理。{\displaystyle T}是该图唯一的最小生成树，令{\displaystyle S=\left\{A,B,D,E\right\}}，则{\displaystyle V-S=\left\{C,F\right\}}，这样就形成了一个割，其割集包含3条割边，即BC，EC，EF，如果去除它们就可以将这两个子图完全断开。在割集中，{\displaystyle e}是权值最小的边，所以{\displaystyle S\cup \left\{e\right\}}是最小生成树{\displaystyle T}的一部分。
在一幅连通加权无向图中，给定任意的割，如有一条割边的权值严格小于所有其他割边，则这条边必然属于图的最小生成树。

证明：  

令{\displaystyle e}为权重最小的割边，假设{\displaystyle T}为图的最小生成树，且{\displaystyle T}不包含{\displaystyle e}。那么如果将{\displaystyle e}加入{\displaystyle T}，得到的图必然含有一条经过{\displaystyle e}的环，且这个环也含有另一条割边--设为{\displaystyle e'}，{\displaystyle e'}的权重必然大于{\displaystyle e}，那么用{\displaystyle e}替换{\displaystyle e'}可以形成一个权值小于{\displaystyle T}的生成树，与{\displaystyle T}为最小生成树矛盾。所以假设不成立，因此{\displaystyle T}必然包含{\displaystyle e}。。

### 最小权值边

如果图的具有最小权值的边只有一条，那么这条边包含在任意一个最小生成树中。

证明：  

假设该边{\displaystyle e}没有在最小生成树{\displaystyle T}中，那么将{\displaystyle e}加入{\displaystyle T}中会形成环，用{\displaystyle e}替换环中的任意一条权值更大的边，将会形成权值更小的生成树，与题设矛盾。

相关算法
----

### 历史简介

计算稠密图的最小生成树最早是由羅伯特·C·普里姆在1957年发明的，即普里姆算法。之后艾兹赫尔·戴克斯特拉也独自发明了它。但该算法的基本思想是由沃伊捷赫·亚尔尼克（英语：）于1930年发明的。所以该算法有时候也被称为亞爾尼克算法或者普里姆-亞爾尼克算法。20世纪70年代，优先队列发明之后很快被用在了寻找稀疏图中的最小生成树上。1984年，迈克尔·弗里德曼和罗伯特·塔扬发明了斐波那契堆，普里姆算法所需要的运行时间在理论上由{\displaystyle E\log E}提升到了{\displaystyle E+V\log V}。约瑟夫·克鲁斯卡尔在1956年发表了他的算法，在他的论文中提到了普里姆算法的一个变种，而奥塔卡尔·布卢瓦卡（英语：）在20世纪20年代的论文中就已经提到了该变种。M.Sollin在1961年重新发现了该算法，该算法后成为实现较好渐进性能的最小生成树算法和并行最小生成树算法的基础。

以下各算法介绍中，{\displaystyle E}表示图的边数，{\displaystyle V}表示图的顶点数。　

### 布卢瓦卡算法

第一个用于寻找最小生成树的算法由捷克科学家奥塔卡尔·布卢瓦卡（英语：）提出，即布卢瓦卡算法（英语：）。

### 普里姆算法

条目：普里姆算法
普里姆算法的每一步都会为一棵生长中的树添加一条边，该树最开始只有一个顶点，然后会添加{\displaystyle V-1}个边。每次总是添加生长中的树和树中除该生长的树以外的部分形成的切分的具有最小权值的横切边。

普里姆算法的时间复杂度为{\displaystyle O(E+V\log V)}。

### 克鲁斯克尔算法

条目：克鲁斯克尔演算法
按照边的权重顺序（从小到大）将边加入生成树中，但是若加入该边会与生成树形成环则不加入该边。直到树中含有{\displaystyle V-1}条边为止。这些边组成的就是该图的最小生成树。

克鲁斯克尔算法的时间复杂度为{\displaystyle E\log E}。

### 更快的算法

一些研究者希望可以找出更为高效的算法，在这方面也有了一定的成果。
Karger，Klein & Tarjan (1995)针对边的权值可以成对比较的特殊模型提出了一个基于Borůvka算法和翻转删除算法的可以在线性时间内解决最小生成树的算法。

最快的非随机比较算法是由伯纳德·沙泽勒（英语：）提出的。该算法依赖于soft heap（英语：）这样一个类似于优先级队列的数据结构 。该算法的时间复杂度为{\displaystyle O(E\alpha (E,V))}。{\displaystyle \alpha }就是阿克曼函数反函数，{\displaystyle \alpha }的增长速度非常慢，对于一般的数值来说，其值很难超过5，所以该算法的复杂度可以近似看成是线性时间。

### 线性时间的最小生成树算法

目前，既不能证明不存在能在线性时间内得到任意图的最小生成树的算法，也未能发明能够在线性时间内计算稀疏图的最小生成树的算法。

相关问题
----

k-最小生成树（英语：）：图中包含k个顶点的所有子图的所有最小生成树中权值最小的生成树。

欧几里得最小生成树（英语：）是一个用欧几里得距离来表示权值的连通加权图的最小生成树。

方格线最小生成树（英语：）是一个用曼哈顿距离来表示权值的连通加权图的最小生成树。

容量最小生成树（英语：）是一棵树且其每个节点的子树的容量都不大于{\displaystyle C}。解决该问题是NP困难的。但是伊萨·威廉姆斯和夏尔马以及提出了可以在接近多项式时间内解决该问题的启发式。

度受限最小生成树（英语：）是一棵树，其每一个顶点连接的顶点数都不超过d。对一些特定的d值，该问题类似于旅行推销员问题。该问题也是NP困难的。

对有向图来说，其与最小生成树类似的图处理问题叫做最小树形图问题。

**最大生成树**是一棵比其它所有生成树都要大或者相等的生成树。其解决方法类似于最小生成树算法。求解最大生成树的算法在自然语言处理以及条件随机场这些问题上起到很大的作用。

**动态最小生成树**是在已经计算完一个图的最小生成树后动态改变一些边的取值或删除/添加一些点或者边，求解新图的最小生成树。

参考文献
----

* Otakar Boruvka on Minimum Spanning Tree Problem (translation of the both 1926 papers, comments, history) (2000) （页面存档备份，存于） Jaroslav Nešetřil, Eva Milková, Helena Nesetrilová. (Section 7 gives his algorithm, which looks like a cross between Prim's and Kruskal's.)
* Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein. *Introduction to Algorithms*, Second Edition. MIT Press and McGraw-Hill, 2001. ISBN 0-262-03293-7. Chapter 23: Minimum Spanning Trees, pp. 561–579.
* Eisner, Jason (1997). State-of-the-art algorithms for minimum spanning trees: A tutorial discussion （页面存档备份，存于）. Manuscript, University of Pennsylvania, April. 78 pp.
* Kromkowski, John David. "Still Unmelted after All These Years", in Annual Editions, Race and Ethnic Relations, 17/e (2009 McGraw Hill) (Using minimum spanning tree as method of demographic analysis of ethnic diversity across the United States).

外部链接
----

* Implemented in BGL, the Boost Graph Library （页面存档备份，存于）
* The Stony Brook Algorithm Repository - Minimum Spanning Tree codes （页面存档备份，存于）
* Implemented in QuickGraph for .Net

|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
算法 |
| --- |
|  |
| 排序 | 

|  |  |
| --- | --- |
| 比较排序 | 
* 冒泡排序
* 选择排序
* 插入排序
* 希尔排序
* 快速排序
* 归并排序
* 堆排序
* 鸡尾酒排序
* 梳排序
* 侏儒排序
* 图书馆排序
* 内省排序
* 奇偶排序

 |
|  |
| 线性时间排序 | 
* 鸽巢排序
* 基数排序
* 計數排序
* 桶排序

 |
|  |
| 并行排序 | 
* 排序网络（英语：）
* Batcher归并网络

 |
|  |
| 不实用的 | 
* Bogo排序
* 臭皮匠排序

 |
|  |
| 图 | 
* 拓撲排序

 |

 |
|  |
| 搜索 | 

|  |  |
| --- | --- |
| 列表 | 
* 线性搜索
* 二分搜索
* 插值搜尋

 |
|  |
| 树・图 | 
* 广度优先搜索
	+ 最良優先搜索（英语：）
	+ 均一开销搜索
	+ A\*
* 深度优先搜索
	+ 迭代深化深度优先搜索
	+ 深度限制搜索（日语：）
	+ 双向搜索
* 分枝限定法（英语：）

 |
|  |
| 字符串 | 
* KMP算法
* 博耶-穆尔字符串搜索算法
* AC自动机算法
* 拉宾-卡普算法
* bitap算法

 |

 |
|  |
| 最短路问题 | 
* 戴克斯特拉算法
* 贝尔曼-福特算法
* A\*搜尋演算法
* Floyd-Warshall算法

 |
|  |
| 最小生成树 | 
* 普林姆算法
* 克鲁斯克尔演算法

 |
|  |
| 最大流最小割 | 
* 福特-富尔克森算法
* 埃德蒙兹-卡普算法
* 迪尼茨算法

 |
|  |
| 线性规划 | 
* 单纯形法
* 卡马卡尔算法（英语：）

 |
|  |
| 順序統計量 | 
* 选择算法
* 中位数的中位数（英语：）

 |
|  |
| 種類 | 
* 精确算法
* 近似算法
* 随机化算法

 |
|  |
| 其他 | 
* 分治法
* 动态规划
* 贪心算法

 |
|  |
| **Category:算法** |

 |