我们设计了一个简单的例子,如图所示(图中节点间的距离可能跟边值大小不成比例~,红色边为最小生成树的结果!).
Python版本实现,这里使用到了Disjoint Set(不交集),关于Disjoint Set参考这里解释。下面是具体实现:
from operator import itemgetter
class DisjointSet(dict):
def add(self, item):
self[item] = item
def find(self, item):
parent = self[item]
while self[parent] != parent:
parent = self[parent]
self[item] = parent
return parent
def union(self, item1, item2):
self[item2] = self[item1]
def kruskal( nodes, edges ):
forest = DisjointSet()
mst = []
for n in nodes:
forest.add( n )
sz = len(nodes) - 1
for e in sorted( edges, key=itemgetter( 2 ) ):
n1, n2, _ = e
t1 = forest.find(n1)
t2 = forest.find(n2)
if t1 != t2:
mst.append(e)
sz -= 1
if sz == 0:
return mst
forest.union(t1, t2)
#test
nodes = list( "123456" )
edges = [ ("1", "2", 1), ("1", "4", 2),
("2", "4", 4), ("2", "3", 6), ("2", "5", 7),
("3", "6", 5),
("5", "6", 4), ("4", "5", 9),["3","5",8]]
print kruskal( nodes, edges )
执行结果跟前面一致:“[('1', '2', 1), ('1', '4', 2), ('5', '6', 4), ('3', '6', 5), ('2', '3', 6)]”
附件下载 Dbank: http://dl.dbank.com/c05gv0a1hf
Python解答来源:http://programmingpraxis.com/2010/04/06/minimum-spanning-tree-kruskals-algorithm/