最小生成樹,克魯斯卡爾算法(Python實現)

December 17, 2015 1:49 PM
一、克魯斯卡爾算法的基本思想:

設有一個有n個頂點的連通網N={V,E},最初先構造一個只有n個頂點,沒有邊的非連通圖T={V, E},圖中每個頂點自成一個連通分量。當在E中選到一條具有最小權值的邊時,若該邊的兩個頂點落在不同的連通分量上,則將此邊加入到T中;否則將此邊捨去,重新選擇一條權值最小的邊。如此重複下去,直到所有頂點在同一個連通分量上爲止。

二、算法構造一顆最小生成樹的過程如下:
克魯斯卡爾算法

#Kruskal.py
#王淵
#2015.12.16
#Email:[email protected]

from pylab import *

INFINITY = 65535                        #代表無窮大
vexs = array([[0,10,INFINITY,INFINITY,INFINITY,11,INFINITY,INFINITY,INFINITY],#鄰接矩陣
        [10,0,18,INFINITY,INFINITY,INFINITY,16,INFINITY,12],
        [INFINITY,18,0,22,INFINITY,INFINITY,INFINITY,INFINITY,8],
        [INFINITY,INFINITY,22,0,20,INFINITY,INFINITY,16,21],
        [INFINITY,INFINITY,INFINITY,20,0,26,INFINITY,7,INFINITY],
        [11,INFINITY,INFINITY,INFINITY,26,0,17,INFINITY,INFINITY],
        [INFINITY,16,INFINITY,24,INFINITY,17,0,19,INFINITY],
        [INFINITY,INFINITY,INFINITY,16,7,INFINITY,19,0,INFINITY],
        [INFINITY,12,8,21,INFINITY,INFINITY,INFINITY,INFINITY,0]])

lengthVex = len(vexs)                   #鄰接矩陣大小
beginEdge = []
endEdge = []
weight = []
group = []
for i in arange(lengthVex):             #生成邊集數組
    group.append([i])
    for j in arange(i+1,lengthVex):
        if(vexs[i, j]>0 and vexs[i, j]<INFINITY):
            beginEdge.append(i)         #每條邊的起點
            endEdge.append(j)           #每條邊的終點
            weight.append(vexs[i, j])   #每條邊的權值

lengthEdge = len(weight)                #邊的條數
sum = 0
for i in arange(lengthEdge):            #遍歷每條邊
    I = (argsort(weight))[0]
    for j in arange(lengthVex):
        if(beginEdge[I]) in group[j]:
            m = j
        if(endEdge[I]) in group[j]:
            n = j
    if m != n:                          #判斷當前這條邊是否屬於不同的連通分量,如果是,將其合併
        group[m] = group[m] + group[n]
        group[n] = []
        sum = sum + weight[I]
        print(weight[I])
    del weight[I]                       #刪除遍歷過的邊以及頂點
    del beginEdge[I]
    del endEdge[I]
print("The length of the minimum cost spanning tree is: ",sum)
發佈了30 篇原創文章 · 獲贊 7 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章