生成樹的定義:對於一個圖G,獲取G的邊使得全部的頂點都鏈接到。最小生成樹(MST Minimun spanning tree):給定圖G(V,E),以及對應的邊的權重,獲取一顆總權重最小的生成樹。算法
樹的定義:鏈接的無環圖數據結構
找到全部的生成樹,而後計算權重最小的cors
考慮上面的圖,一但紅色線選定,對於接下了的標號爲1,..,n的全部節點點,左右節點都只須要二選一便可獲得不一樣的生成樹,這樣的選擇有 種,太多假如邊e={u,v}是某個MST的一條邊,經過對合並這兩個頂點爲一個新的頂點(這種操做稱做contract e),將有多條邊同時鏈接多個頂點的合併成一個權重最小的邊保留,其它邊的鏈接形式保持不變。能夠證實假設T'是G/e(不包含e的G)的MST,那麼T'U{e}也是G的MST
函數
假設T*()是G的MST,那麼 T*/e(即T') 也是 G/e的MST,即spa
而w(T'Ue)=w(T')+w(e),因此.net
於是成立3d
假設有任意的cut(S,V-S),選取e,使得e是全部crossing cut的最小權重的邊,那麼e確定是屬於某個MST。code
紅色的線即 crossing cut的邊cdn
假設T是G的一個MST,那麼它一定存在一條邊e'={u',v'}橫跨S和V/S,因爲w(e)<=w(e'),能夠構造T'=T/{e'}U{e}=w(T)-w(e')+w(e)<=w(T),也就是說T'也是MST,e屬於某個MST。blog
維護一個優先級隊列Q,它的節點u.key=min{w(u,v)|u in s and v in (S-V)}
初始的圖以下
選取節點s in S,其它的爲V-S 按照初始化的規則獲得而後獲取最小key的節點,顯然他就是S
獲取S的全部鄰接表,比較crossing cut的邊的權值和當前Q中存儲的key的大小,保留小的,獲得再找到Q中最小的爲A,將二者記下來
再查看全部S的鄰接表,更新Q的權值,獲得
獲取最小值爲5,將它放入S中
獲取最小是爲6,獲得
再更新Q最小值爲8
更新Q獲得
最小值爲3
更新Q獲得
最小值爲9
更新Q獲得最小值爲15
最終獲得MST爲在整個過程當中,涉及V次的從優先級隊列中獲取最小值,以及邊兩倍次的減小key的值,因此總的時間爲
使用斐波那契堆能夠達到VlgV+E
核心思想:全局最小的corssing cut邊一定屬於最小生成樹,這個過程不能生成環,須要追蹤兩個節點是否已經互相鏈接了
追蹤的數據結構是 Union-Find 結構,包含3個功能,Make-Set:建立一個集合;Find-Set:找到當前元素在那個集合;Union:合併集合
在使用Union-Find數據結構的基礎上可以作到時間爲O(ElgE+Eα(V)),假設權重爲正整數並且最大值是個常量,那麼排序能夠達到常量的時間,這個時候,算法所須要的時間就是O(E),總體不Prims算法要好
最快的MST 算法運行指望時間是O(V+E),Karger, Klein, and Tarjan 1993發明