首先,最小生成樹是建立在無向圖中的,對於乙個有n個點的圖,最少需要n-1條邊使得這n個點進行連通,由這n-1條邊組成的子圖稱為原圖的生成樹,乙個圖的生成樹並不是唯一的。最小生成樹則是樹中權值之和最小的一顆生成樹,最小生成樹也可能不唯一。最小生成樹一般有兩種演算法,一種是prim演算法,另一種是krukal演算法。兩種演算法都是基於貪心思想,但兩種演算法並不完全相同。
通過區域性最優策略,每次將一條邊加入樹中,加完n-1條邊之後,保證整體是最優的,即為最小生成樹。prim演算法將圖中的點分成三個狀態,一種是已經在樹中的點,另一種是沒在樹中,但是和樹中的點相鄰,即將要加入圖中的候選點,還有一種則是還沒檢測到的點。
prim演算法分為五個步驟,首先將所有點初始化為未檢測到的點,隨機設乙個點為最小生成樹的父節點,然後將與父節點相鄰的點設為候選點,在所有的候選點中選擇權值最小的邊加入到生成樹中變成樹中的點,將其所對應的權值加入到樹中,依次類推,最後如果圖中所有的點都在樹中,則圖中的乙個最小生成樹找到。
他和prim演算法不同的是,不是通過連通的分量找到樹,而是將多個連通分量合到一起得到一顆生成樹。krukal演算法首先將圖中所有邊按照權值從小到大排序,設構造的生成樹為t,然後從小到大列舉邊,設當前列舉邊為e(u,v),判斷如果u、v不在同乙個集合中,則將e加入到t中,並將u、v合併到乙個集合中,否則忽略e,繼續列舉邊,直到列舉到最後一條邊時,也就是當樹中含有n-1條邊時,此時說明找到原圖中的最小生成樹,否則說明原圖中沒有最小生成樹,演算法結束。
總結:到此為止,最小生成樹的總結就寫完了,介紹的兩個演算法都是基於貪心思想的應用。個人覺得學習演算法一定不能僅僅記住演算法的**實現,一定還要理解其中的思想和正確性。只有這樣才能真正了解乙個演算法的精髓。就算是忘了**的實現,理解了思想也能自己推出來。
最小生成樹 kruskal c 演算法 總結
首先,什麼是kruskal演算法 克魯斯卡爾演算法 kruskal s algorithm 是兩個經典的最小生成樹演算法的較為簡單理解的乙個。這裡面充分體現了貪心演算法的精髓。大致的流程可以用乙個圖來表示。這裡的圖的選擇借用了wikipedia上的那個。非常清晰且直觀。首先第一步,我們有一張圖,有若...
最小生成樹演算法總結 Kruskal,Prim
今天覆習最小生成樹演算法。最小生成樹指的是在乙個圖中選擇n 1條邊將所有n個頂點連起來,且n 1條邊的權值之和最小。形象一點說就是找出一條路線遍歷完所有點,不能形成迴路且總路程最短。kurskal演算法的核心思想是將邊按權值排序,每次選出權值最小的邊,只要不會形成迴路就加入結果集,如果形成了迴路就不...
演算法總結篇 最小生成樹
目錄算是最後幾個完成這一章節學習的了,有很多思想和技巧都很好,需要好好學習 主要涉及兩個演算法 prim 演算法和 kruskal 演算法 感謝lsp為本文訂正做出的貢獻!先跑一遍 dij 求出 d i 再遍歷每個點,統計有幾種修建方案 然後根據乘法原理,求出所有方案數即可 感覺和最小生成樹沒半毛錢...