python实现源代码_python 实现并查集源代码

问题描述:

f70e52d77c25ea691dc5c2acb8eb5c76.png

#coding:utf-8

#py2.7

class unionfind:

def __init__(self, groups):

self.groups=groups

self.items=[]

for g in groups:

self.items+=list(g)

self.items=set(self.items)

self.parent={}

self.rootdict={} #记住每个root下节点的数量

for item in self.items:

self.rootdict[item]=1

self.parent[item]=item

def union(self, r1, r2):

rr1=self.findroot(r1)

rr2=self.findroot(r2)

cr1=self.rootdict[rr1]

cr2=self.rootdict[rr2]

if cr1>=cr2: #将节点数量较小的树归并给节点数更大的树

self.parent[rr2]=rr1

self.rootdict.pop(rr2)

self.rootdict[rr1]=cr1+cr2

else:

self.parent[rr1]=rr2

self.rootdict.pop(rr1)

self.rootdict[rr2]=cr1+cr2

def findroot(self, r):

"""

可以通过压缩路径来优化算法,即遍历路径上的每个节点直接指向根节点

"""

if r in self.rootdict.keys():

return r

else:

return self.findroot(self.parent[r])

def createtree(self):

for g in self.groups:

if len(g)< 2:

continue

else:

for i in range(0, len(g)-1):

if self.findroot(g[i]) != self.findroot(g[i+1]): #如果处于同一个集合的节点有不同的根节点,归并之

self.union(g[i], g[i+1])

def printree(self):

rs={}

for item in self.items:

root=self.findroot(item)

rs.setdefault(root,[])

rs[root]+=[item]

for key in rs.keys():

print rs[key],

u=unionfind([('a','b','c'),('b','d'),('e','f'),('g'),('d','h')])

u.createtree()

u.printree()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值