最小生成樹之克魯斯卡爾演算法的python實現

2021-10-23 10:10:08 字數 2012 閱讀 9781

克魯斯卡爾演算法是求連通網的最小生成樹的另一種方法。與普里姆演算法不同,它適合於求邊稀疏的網的最小生成樹。

以字典的形式建立加權連通圖,通常以各頂點為字典的鍵,與該頂點所能連通的其餘頂點再次構成乙個子字典。這個子字典的鍵為所能連通的頂點,值為這個有向邊的權重。這個子字典則構成了乙個完整的值。

例如以下加權連通圖:

可表示為:

graph = ,

1: ,

2: ,

3: ,

4: ,

5: ,

6: ,

7: }

將所有邊以三元組(始點,終點,權值)的形式放入到列表中。

並將其按照權值大小排序。

def init_distance(graph):

distance_list =

for i in graph.keys():

for j in graph[i].keys():

if i != j:

distance_list.sort(key = lambda x:x[-1],reverse = false)

return distance_list

在上一步驟中我們已經將所有邊按權重大小排序完成,接著就是由小到大依次取出所有邊,如果加入該邊後所有已選擇的邊不構成閉環,則該邊被成功選入,否則拋棄。

而檢視是否構成閉環可以使用並查集的方法。

初始我們可以將所有頂點單獨處於乙個集合中,每次加入一條邊時,判斷該邊的始點和終點是否處於同乙個集合中,若是,則會構成閉環,若沒有在同乙個集合中,則不構成閉環。

graph = ,

1: ,

2: ,

3: ,

4: ,

5: ,

6: ,

7: ,

8: {}

}#初始化並查集,使每乙個節點單獨存在於乙個集合中

def init_set(graph):

set_dic = dict()

for i,j in zip(range(len(graph)),graph.keys()):

set_dic[i] =

return set_dic

#將邊及權重以三元組 "(始點,終點,權重)"的形式存放在數列中,

#並按照權重大小進行由低到高排序

def init_distance(graph):

distance_list =

for i in graph.keys():

for j in graph[i].keys():

if i != j:

distance_list.sort(key = lambda x:x[-1],reverse = false)

return distance_list

set_dic = init_set(graph)

distance_list = init_distance(graph)

choice = #以選取邊的列表,choice:選擇

#判斷邊的首尾兩頂點是否在同乙個集合內,若不在,則構不成環,

#將此邊放入choice列表中

for edge in distance_list:

for i in set_dic.keys():

if edge[0] in set_dic[i]:

shou = i

if edge[1] in set_dic[i]:

wei = i

if shou != wei:

set_dic[shou] = set_dic[shou] | set_dic[wei]

del set_dic[wei]

print(sum([x[-1] for x in choice]))

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

include iostream include algorithm using namespace std struct edge 用於把所有邊按權重的大小排序 bool comp const edge e1,const edge e2 使用並查集來判斷兩個點是否在同乙個連通塊中。在每個連通塊中,...

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

c node.h檔案 儲存頂點資訊 class c node c node c node c node p node c node c node c node c node char p data node.h檔案,儲存邊資訊 include class link node link node li...

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

name author date 01 12 14 20 17 description 最小生成樹 克魯斯卡爾演算法 關於並查集的演算法,參見 一種簡單而有趣的資料結構 並查集 include include define maxn 1000 最大頂點數量 define max 20000 最大邊數...