Python算法 Kruskal算法

我们设计了一个简单的例子,如图所示(图中节点间的距离可能跟边值大小不成比例~,红色边为最小生成树的结果!).

最小生成树

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/



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值