【需求】將兩兩生成的最短路徑生成最小樹
【分析】根據最小樹的原理編寫程序,利用圖來生成最小樹
#! /usr/bin/env python
#coding:utf-8
#以全局變量X定義節點集合,即類似{'A':'A','B':'B','C':'C','D':'D'},如果A、B兩點聯通,則會更改爲{'A':'B','B':'B",...},即任何兩點聯通之後,兩點的值value將相同。
X = dict()
#各點的初始等級均爲0,如果被做爲連接的的末端,則增加1
R = dict()
#設置X R的初始值
def make_set(point):
X[point] = point
R[point] = 0
#節點的聯通分量
def find(point):
if X[point] != point:
X[point] = find(X[point])
return X[point]
#連接兩個分量(節點)
def merge(point1,point2):
r1 = find(point1)
r2 = find(point2)
if r1 != r2:
if R[r1] > R[r2]:
X[r2] = r1
else:
X[r1] = r2
if R[r1] == R[r2]: R[r2] += 1
#KRUSKAL算法實現
def kruskal(graph):
for vertice in graph['vertices']:
make_set(vertice)
minu_tree = set()
edges = list(graph['edges'])
edges.sort() #按照邊長從小到達排序
for edge in edges:
weight, vertice1, vertice2 = edge
if find(vertice1) != find(vertice2):
merge(vertice1, vertice2)
minu_tree.add(edge)
return minu_tree
if __name__=="__main__":
graph = {
'vertices': ['A', 'B', 'C', 'D', 'E', 'F'],
'edges': set([
(1, 'A', 'B'),
(5, 'A', 'C'),
(3, 'A', 'D'),
(4, 'B', 'C'),
(2, 'B', 'D'),
(1, 'C', 'D'),
])
}
result = kruskal(graph)
print result
網上已經有許多關於最小樹算法,大多都是通過類來定義,通過圖這一數據結構來解決,因爲之前對圖的數據結構不太瞭解,所以現在還在苦啃數據結構一書,希望能有所突破