最小生成樹

平面圖和它的最小生成樹。在該圖中，邊的長度正比於權值A。
最小生成樹（Minimum spanning tree，簡稱MST）是最小權重生成樹（Minimum weight spanning tree）的簡稱，是一個連通加權無向圖中一棵權值最小的生成樹。
在一給定的無向圖  中， 代表連接頂點 u 與頂點 v 的邊（即 ），而  代表此邊的權重，若存在 T 為 E 的子集（即 ）且 (V, T) 為樹，使得：

的 w(T) 最小，則此 T 為 G 的最小生成樹。
一個連通圖可能有多個生成樹。當圖中的邊具有權值時，總會有一個生成樹的邊的權值之和小於或者等於其它生成樹的邊的權值之和。廣義上而言，對於非連通無向圖來說，它的每一連通分量同樣有最小生成樹，它們的並被稱為最小生成森林。
以有線電視電纜的架設為例，若只能沿著街道佈線，則以街道為邊，而路口為頂點，其中必然有一最小生成樹能使佈線成本最低。

**相關性質**

**存在個數**
這張圖表明一個圖中可能有多個最小生成樹
最小生成樹在一些情況下可能會有多個。例如，當圖的每一條邊的權值都相同時，該圖的所有生成樹都是最小生成樹。

**唯一性**
如果圖的每一條邊的權值都互不相同，那麼最小生成樹將只有一個。這一定理同樣適用於最小生成森林。
證明：
假設圖為每條邊權值互不相同的連通圖，且有兩個不同的最小生成樹和。
則中必然存在一些在中並不存在的邊，取其中一條這樣的邊。
因為是最小生成樹，所以若往中添加邊，則將會出現環路。（因為有個頂點的樹有且僅有條邊）
同時可知，如果從中刪除邊，則將分為互不連通的兩個連通分量。因為，所以中必然有其他的邊連接這兩個連通分量。且將加入後形成的環路中，除了外至少有另一條連接中刪除後的這兩個連通分量的邊。取其中一條這樣的邊，記作。此時若將加入，則可連接從中刪除後得到的兩個連通分量，並形成一棵不同的生成樹。
因為中所有邊的權值互不相同，所以關於和的權重大小關係，可能有以下兩種情況之一：
# 若，則可從中刪除並加入，從而得到一棵總權值更小的生成樹。這和是最小生成樹相矛盾。
# 若，則可從中刪除並加入，從而得到一棵總權值更小的生成樹。同樣，這和是最小生成樹相矛盾。
綜上，若各邊權重互不相等，則不可能存在兩棵互不相同的最小生成樹。即的最小生成樹是唯一的。

**邊的權值之和最低的子圖**
如果圖的邊的權值都為正數，那麼最小生成樹就是該圖的所有包含所有頂點的子圖中權值最低的連通子圖。

**環定理**
對於連通圖中的任意一個環：如果中有邊的權值大於該環中任意一個其它的邊的權值，那麼這個邊不會是最小生成樹中的邊
證明：
假設屬於最小生成樹，那麼將刪去將會使得變為兩個樹。因為環必然還存在另一橫切邊ｆ可以連接兩個子樹形成生成樹，且由於＜，生成樹權值更小，與是最小生成樹矛盾。

**割定理**
此圖展示了最小生成樹的割定理。是該圖唯一的最小生成樹，令，則，這樣就形成了一個割，其割集包含3條割邊，即BC，EC，EF，如果去除它們就可以將這兩個子圖完全斷開。在割集中，是權值最小的邊，所以是最小生成樹的一部分。
在一幅連通加權無向圖中，給定任意的割，如有一條割邊的權值嚴格小於所有其他割邊，則這條邊必然屬於圖的最小生成樹。
證明：
令為權重最小的割邊，假設為圖的最小生成樹，且不包含。那麼如果將加入，得到的圖必然含有一條經過的環，且這個環也含有另一條割邊--設為，的權重必然大於，那麼用替換可以形成一個權值小於的生成樹，與為最小生成樹矛盾。所以假設不成立，因此必然包含。。

**最小權值邊**
如果圖的具有最小權值的邊只有一條，那麼這條邊包含在任意一個最小生成樹中。
證明：
假設該邊沒有在最小生成樹中，那麼將加入中會形成環，用替換環中的任意一條權值更大的邊，將會形成權值更小的生成樹，與題設矛盾。

**相關算法**

**歷史簡介**
計算稠密圖的最小生成樹最早是由羅伯特·C·普里姆在1957年發明的，即普里姆算法。之後艾茲赫爾·戴克斯特拉也獨自發明瞭它。但該算法的基本思想是由Vojtěch Jarník於1930年發明的。所以該算法有時候也被稱為亞爾尼克算法或者普里姆-亞爾尼克算法。20世紀70年代，優先隊列發明之後很快被用在了尋找稀疏圖中的最小生成樹上。1984年，邁克爾·弗裡德曼和羅伯特·塔揚發明了斐波那契堆，普里姆算法所需要的運行時間在理論上由提升到了。約瑟夫·克魯斯卡爾在1956年發表了他的算法，在他的論文中提到了普里姆算法的一個變種，而Otakar Borůvka在20世紀20年代的論文中就已經提到了該變種。M.Sollin在1961年重新發現了該算法，該算法後成為實現較好漸進性能的最小生成樹算法和並行最小生成樹算法的基礎。
以下各算法介紹中，表示圖的邊數，表示圖的頂點數。　

**布盧瓦卡算法**
第一個用於尋找最小生成樹的算法由捷克科學家Otakar Borůvka提出，即Borůvka's algorithm。

**普里姆算法**
普里姆算法的每一步都會為一棵生長中的樹添加一條邊，該樹最開始只有一個頂點，然後會添加個邊。每次總是添加生長中的樹和樹中除該生長的樹以外的部分形成的切分的具有最小權值的橫切邊。
普里姆算法的時間複雜度為。

**克魯斯克爾算法**
按照邊的權重順序（從小到大）將邊加入生成樹中，但是若加入該邊會與生成樹形成環則不加入該邊。直到樹中含有條邊為止。這些邊組成的就是該圖的最小生成樹。
克魯斯克爾算法的時間複雜度為。

**更快的算法**
一些研究者希望可以找出更為高效的算法，在這方面也有了一定的成果。
針對邊的權值可以成對比較的特殊模型提出了一個基於Borůvka算法和翻轉刪除算法的可以在線性時間內解決最小生成樹的算法。
最快的非隨機比較算法是由Bernard Chazelle提出的。該算法依賴於soft heap這樣一個類似於優先級隊列的數據結構 。該算法的時間複雜度為。就是阿克曼函數反函數，的增長速度非常慢，對於一般的數值來說，其值很難超過5，所以該算法的複雜度可以近似看成是線性時間。

**線性時間的最小生成樹算法**
目前，既不能證明不存在能在線性時間內得到任意圖的最小生成樹的算法，也未能發明能夠在線性時間內計算稀疏圖的最小生成樹的算法。

**相關問題**
：圖中包含k個頂點的所有子圖的所有最小生成樹中權值最小的生成樹。
是一個用歐幾里得距離來表示權值的連通加權圖的最小生成樹。
是一個用曼哈頓距離來表示權值的連通加權圖的最小生成樹。
是一棵樹且其每個節點的子樹的容量都不大於。解決該問題是NP困難的。但是伊薩·威廉姆斯和夏爾馬以及提出了可以在接近多項式時間內解決該問題的啟發式。
是一棵樹，其每一個頂點連接的頂點數都不超過d。對一些特定的d值，該問題類似於旅行推銷員問題。該問題也是NP困難的。
對有向圖來說，其與最小生成樹類似的圖處理問題叫做最小樹形圖問題。
最大生成樹是一棵比其它所有生成樹都要大或者相等的生成樹。其解決方法類似於最小生成樹算法。求解最大生成樹的算法在自然語言處理以及條件隨機場這些問題上起到很大的作用。
動態最小生成樹是在已經計算完一個圖的最小生成樹後動態改變一些邊的取值或刪除/添加一些點或者邊，求解新圖的最小生成樹。

**註釋**
：用一條邊鏈接樹中的任意兩個頂點都會產生一個新的環。

**參考**

**參考文獻**
  Otakar Boruvka on Minimum Spanning Tree Problem (translation of the both 1926 papers, comments, history) (2000) date=20080504022457  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 date=20200215100901 . 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 date=20080821220341 -  The Stony Brook Algorithm Repository - Minimum Spanning Tree codes date=20140724034250 -  Implemented in QuickGraph for .Net