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)