算法記錄---最小生成樹【kruskal&&prim】

生成樹
給定一個無向圖,如果它的某個子圖中任意兩個頂點都互相連通並且是一棵樹。
生成樹不唯一
 
最小生成樹:
如果邊上有權值,那麼使得權值和最小的生成樹叫做最小生成樹
構造最小生成樹的準則:
1.必須使用且僅使用該網絡中的n-1 條邊來聯結網絡中的 n 個頂點;
2.不能使用產生迴路的邊;
3.各邊上的權值的總和達到最小。
兩種常用的構造最小生成樹的方法:
1.克魯斯卡爾算法(從邊入手)
2.普里姆算法(從點入手
克魯斯卡爾: 在剩下的所有未選取的邊中,找最小邊,如果不產生環(重邊也算在內),就把當前這條邊加入到生成樹中,如果和已選取的邊構成迴路,則放棄,選取次小邊。(判斷是否成環:運用並查集)
基本思想
   先構造一個只含 n 個頂點、而邊集爲空的子圖,把子圖中各個頂點看成各棵樹上的根結點(即這n個頂點都是獨立的),之後,從網的邊集 E 中選取一條權值最小的邊,若該條邊的兩個頂點分屬不同的樹,則將其加入子圖,即把兩棵樹合成一棵樹,反之,若該條邊的兩個頂點已落在同一棵樹上,則不可取,而應該取下一條權值最小的邊再試之。依次類推,直到森林中只有一棵樹,也即子圖中含有 n-1 條邊爲止。
  時間複雜度爲爲O(e^2), 使用並查集優化後複雜度爲 O(eloge),與網中的邊數有關,適用於求邊稀疏的網的最小生成樹
 
例:hdoj-1233 還是暢通工程  點擊打開鏈接
 
 
普里姆算法:.先選取一個點作起始點,然後選擇它鄰近的權值最小的點(如果有多個與其相連的相同最小權值的點,隨便選取一個)。如1作爲起點。
基本思想:
    從連通網絡 N = { V, E }中的某一頂點 u0 出發, 選擇與它關聯的具有最小權值的邊 ( u0, v ), 將其頂點加入到生成樹頂點集合U中。
    以後每一步從一個頂點在 U 中,而另一個頂點不在 U 中的各條邊中選擇權值最小的邊(u, v), 把它的頂點加入到集合 U 中。如此繼續下去, 直到網絡中的所有頂點都加入到生成樹頂點集合 U 中爲止。 (從點查找)
採用鄰接矩陣或鄰接表作爲圖的存儲表示  
當各邊有相同權值時,由於選擇的隨意性,產生的生成樹可能不唯一。當各邊的權值不相同時,產生的生成樹是唯一的
 
例:
 
發佈了52 篇原創文章 · 獲贊 10 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章