最小生成樹 Kruskal演算法

2021-06-27 07:53:13 字數 1201 閱讀 2759

1.概覽

kruskal演算法是一種用來尋找最小生成樹的演算法,由joseph kruskal在2023年發表。用來解決同樣問題的還有prim演算法和boruvka演算法等。三種演算法都是貪婪演算法的應用。和boruvka演算法不同的地方是,kruskal演算法在圖中存在相同權值的邊時也有效。

2.演算法簡單描述

1).記graph中有v個頂點,e個邊

2).新建圖graphnew,graphnew中擁有原圖中相同的e個頂點,但沒有邊

3).將原圖graph中所有e個邊按權值從小到大排序

4).迴圈:從權值最小的邊開始遍歷每條邊 直至圖graph中所有的節點都在同乙個連通分量中

if 這條邊連線的兩個節點於圖graphnew中不在同乙個連通分量中

新增這條邊到圖graphnew中

圖例描述:

1:首先第一步,我們有一張圖graph,有若干點和邊 

2:將所有的邊的長度排序,用排序的結果作為我們選擇邊的依據。這裡再次體現了貪心演算法的思想。資源排序,對區域性最優的資源進行選擇,排序完成後,我們率先選擇了邊ad。這樣我們的圖就變成了

3:在剩下的邊中尋找。我們找到了ce。這裡邊的權重也是5

4:依次類推我們找到了6,7,7,即df,ab,be。

5:下面繼續選擇, bc或者ef儘管現在長度為8的邊是最小的未選擇的邊。但是現在他們已經連通了(對於bc可以通過ce,eb來連線,類似的ef可以通過eb,ba,ad,df來接連)。所以不需要選擇他們。類似的bd也已經連通了(這裡上圖的連通線用紅色表示了)。

最後就剩下eg和fg了。當然我們選擇了eg。最後成功的圖就是:

最小生成樹 kruskal(演算法)

最小生成樹 圖中有好多點呀 n個 讓我們找到n 1條邊,來把他們連上吧,但是要讓這n 1條邊的和最小。kruskal演算法 把所有邊由公升序排列,然後從最小的一條邊找起,如果這條邊的兩點不屬於乙個集合 此處運用並查集 那麼就要這條邊,否則,忽略這條邊吧 一直這樣找下去,直到找了n 1條邊為止,此時,...

最小生成樹 kruskal演算法

2016.12.30 演算法思想 先將邊按照權值排序,從權值最小的邊開始列舉,如果當前邊連線的兩個點不屬於同一集合,就將這兩個點連起來 用到的資料結構是並查集 一直到列舉完所有的邊,此時生成的就是最小生成樹 include include include include using namespac...

最小生成樹 Kruskal演算法

gramtx minspantree.h pragma once include include include include using namespace std define default vertices size 10 define t char define e int 權值型別 d...