最小生成樹

2021-09-14 08:26:29 字數 2892 閱讀 8602

kruskal演算法基本思路:先對邊按權重從小到大排序,先選取權重最小的一條邊,如果該邊的兩個節點均為不同的分量,則加入到最小生成樹,否則計算下一條邊,直到遍歷完所有的邊。

prim演算法基本思路:所有節點分成兩個group,乙個為已經選取的selected_node(為list型別),乙個為candidate_node,首先任取乙個節點加入到selected_node,然後遍歷頭節點在selected_node,尾節點在candidate_node的邊,選取符合這個條件的邊裡面權重最小的邊,加入到最小生成樹,選出的邊的尾節點加入到selected_node,並從candidate_node刪除。直到candidate_node中沒有備選節點(這個迴圈條件要求所有節點都有邊連線,即邊數要大於等於節點數-1,迴圈開始前要加入這個條件判斷,否則可能會有節點一直在candidate中,導致死迴圈)。

class graph(object):

def __init__(self, maps):

self.maps = maps

self.nodenum = self.get_nodenum()

self.edgenum = self.get_edgenum()

def get_nodenum(self):

return len(self.maps)

def get_edgenum(self):

count = 0

for i in range(self.nodenum):

for j in range(i):

if self.maps[i][j] > 0 and self.maps[i][j] < 9999:

count += 1

return count

def kruskal(self):

res =

if self.nodenum <= 0 or self.edgenum < self.nodenum-1:

return res

edge_list =

# 先對於所有的邊按照權重大小進行排序

for i in range(self.nodenum):

for j in range(i+1,self.nodenum):

if self.maps[i][j] < 9999:

edge_list.sort(key=lambda a:a[2])#已經排好序的邊集合

# 對排序好的陣列從小到大進行排序,如果沒有存在,那麼新增到最後的列表中

# 如果已經連通了,那麼不執行操作

group = [[i] for i in range(self.nodenum)]

for edge in edge_list:

for i in range(len(group)):

if edge[0] in group[i]:

m = i

if edge[1] in group[i]:

n = i

if m != n:

group[m] = group[m] + group[n]

group[n] =

print(group)

return res

def prim(self):

res =

if self.nodenum <= 0 or self.edgenum < self.nodenum-1:

return res

res =

# 設定已經存在的結點集合和待用的結點集合

# 找到已經存在的結點到待用結點集合中的所有結點的權重的最小值

# 執行相應的刪除和新增操作

seleted_node = [0]

candidate_node = [i for i in range(1, self.nodenum)]

while len(candidate_node) > 0:

begin, end, minweight = 0, 0, 9999

for i in seleted_node:

for j in candidate_node:

if self.maps[i][j] < minweight:

minweight = self.maps[i][j]

begin = i

end = j

candidate_node.remove(end)

return res

max_value = 9999

row0 = [0,7,max_value,max_value,max_value,5]

row1 = [7,0,9,max_value,3,max_value]

row2 = [max_value,9,0,6,max_value,max_value]

row3 = [max_value,max_value,6,0,8,10]

row4 = [max_value,3,max_value,8,0,4]

row5 = [5,max_value,max_value,10,4,0]

maps = [row0, row1, row2,row3, row4, row5]

graph = graph(maps)

print('鄰接矩陣為\n%s'%graph.maps)

print('節點資料為%d,邊數為%d\n'%(graph.nodenum, graph.edgenum))

print('------最小生成樹kruskal演算法------')

print(graph.kruskal())

print('------最小生成樹prim演算法')

print(graph.prim())

初始:

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...

最小生成樹

package 圖 最小生成樹是用最少的邊吧把所有的節點連線起來。於是和圖的深度優先搜素差不多。class stack public void push int key public int pop 檢視棧頂的元素 public int peek public boolean isempty cla...

最小生成樹

define max vertex num 20 最大頂點數 typedef int adjmatrix max vertex num max vertex num 鄰接矩陣型別 typedef char vertextype typedef struct mgraph struct dnodecl...