最小生成樹 Kruskal 克魯斯卡爾 演算法

2021-08-25 22:08:40 字數 1293 閱讀 4060

給定乙個無向圖(頂點間連線不帶方向),如果它任意兩個頂點都聯通並且是一棵樹,那麼我們就稱之為生成樹(spanning tree)

如果是帶權值的無向圖,那麼權值之和最小的生成樹,我們就稱之為最小生成樹(mst, minimum spanning tree)

最小生成樹廣泛應用於城市間道路建設的優化,通訊網路最優鋪設等,將網路站點或者城市看成無向圖中的頂點,把每條道路、網線的成本作為權值,從而計算出建設的最小成本

kruskal 是基於貪心的最小生成樹實現演算法,通過將所有邊的權值排序,按從小到大的順序取出,如果邊的端點不屬於同乙個集合(未聯通,該道路需要建設),那麼將這兩個端點所屬的兩個集合合併(建設道路後,端點聯通),直到所有點屬於乙個集合為止

為了高效查取端點的集合歸屬,用到了並查集,可以說 kruskal是基於並查集的貪心演算法

並查集傳送門:資料結構-並查集

a.起始時每個頂點作為單元素集合

b.對所有邊按權值(成本)進行排序

c.按小到大順序,取出邊(u,v),如果u v 不屬於同一集合,將u,v 所屬集合合併

d.重複c,直到所有邊遍歷完,或者所有頂點連通:假設有m個點,合併的邊數n,最優連通的充要條件 n=m-1

#include#includeusing namespace std;

#define max_size 105

struct road //邊

};road road_list[max_size];

int village[max_size]; //頂點

int rank[max_size]; //記錄高度

void init(int n) //初始化}

int find(int x) //查詢根

return root;

}int combine(int a,int b)

return 1;

}int kruskal(int n,int m) //n為邊總數,m為頂點總數

}if(road_num

return -1;

else

return min_cost;

}

克魯斯卡爾(Kruskal)演算法求最小生成樹

基本思想 設無向連通網為g v,e 令g的最小生成樹為t u,te 其初態為u v,te 然後,按照邊的權值由小到大的順序,考察g的邊集e中的各條邊。若被考察的邊的兩個頂點屬於t的兩個不同的連通分量,則將此邊作為最小生成樹的邊加入到t中,同時把兩個連通分量連線為乙個連通分量 若被考察邊的兩個頂點屬於...

克魯斯卡爾(Kruskal)演算法求最小生成樹

1 基本思想 設無向連通網為g v,e 令g的最小生成樹為t u,te 其初態為u v,te 然後,按照邊的權值由小到大的順序,考察g的邊集e中的各條邊。若被考察的邊的兩個頂點屬於t的兩個不同的連通分量,則將此邊作為最小生成樹的邊加入到t中,同時把兩個連通分量連線為乙個連通分量 若被考察邊的兩個頂點...

克魯斯卡爾(Kruskal)演算法求最小生成樹

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!1 基本思想 設無向連通網為g v,e 令g的最小生成樹為t u,te 其初態為u v,te 然後,按照邊的權值由小到大的順序,考察g的邊集e中的各條邊。若被考察的邊的兩個頂點屬於t的兩個不同的連通分量,則將此邊作為最小生成樹的邊加入到t中,同時把...