kruskal演算法求最小生成樹

2021-08-13 15:29:18 字數 662 閱讀 1598

kruskal演算法是一種使用貪心思路求解無向圖的最小生成樹的演算法。

其大體思路為:將邊按權重排序,然後每次選出權最小且不使圖產生環的邊,作為樹的邊掛上樹。

具體來講就是這麼兩個步驟:

1.把邊按權重排序。

2.依照1的順序遍歷邊:

使用乙個並查集來判斷加進這條邊後圖中是否有環。

如果沒有環,更新並查集,並把此邊加入樹。

並查集判斷環的回顧:

使用乙個陣列儲存每個點的祖先節點。對於無向圖,可以直接按照點的數字大小作為代表元的依據,令值小的為代表元。

如果兩個點v,w,判斷加入新邊e=後是否會產生環的思路是:如果v,w加邊前的代表元相同,那麼就說明v,w間有路,加邊後就會成環。

變數使用: 使用edg記錄每個邊的資訊,fa為並查集,v,e代表圖的節點,邊數。

以hdu1301為例

#include using namespace std;

const int maxn=200;

struct ed

}sort(edg+1,edg+e);

}int kruskal()

}return su;

}int main()

{ while(cin>>v,v!=0)

{init();

cout<

Kruskal演算法求最小生成樹

include include define max vex 100 typedef struct edge edge edgeset max vex 邊集陣列 edgnum max vex 1 int creat return edgnum 排序,使邊集陣列edgeset元素按權值遞增順序排列 v...

kruskal演算法求最小生成樹

描述 要求對乙個圖使用kruskal演算法求最小生成樹,依次輸出選出的邊所關聯的頂點序列,要求下標較小者在前,如圖所示,其頂點序列為1 3 4 6 2 5 3 6 2 3 輸入若干行整數 第一行為兩個整數,分別為圖的頂點數和邊數 第二行開始是該圖的鄰接矩陣,主對角線統一用0表示,無直接路徑的兩點用1...

求最小生成樹 kruskal演算法

kruskal演算法 c 實現 輸入邊資訊 兩頂點及權重 按權重從小到大排序 找n 1條不構成迴路的最小邊 難點 判斷是否構成迴路 include using namespace std 邊結構體 typedef struct edge edge intmain 按照權重從小到大排序 for i 0...