并查集
并查集:也被称为不相交集数据结构。顾名思义,并查集主要操作是合并与查询,它是把初始不相交的集合经过多次合并操作后合并为一个大集合,然后可以通过查询判断两个元素是否已经在同一个集合中了。
class UnionFind(object): """并查集类""" def __init__(self, n): """长度为n的并查集""" self.uf = [-1 for i in range(n + 1)] self.sets_count = n # 判断并查集里共有几个集合, 初始化默认互相独立 def find(self, p): """尾递归""" # 当前值索引位置,-1没有数据,不在当前集合,直接作为根节点返回 if self.uf[p] < 0: return p # 当前索引有数据,递归查找该数据 self.uf[p] = self.find(self.uf[p]) return self.uf[p] def union(self, p, q): """连通p,q 让q指向p""" proot = self.find(p) qroot = self.find(q) if proot == qroot: return elif self.uf[proot] > self.uf[qroot]: # 负数比较, 左边规模更小 self.uf[qroot] += self.uf[proot] self.uf[proot] = qroot else: self.uf[proot] += self.uf[qroot] # 规模相加 self.uf[qroot] = proot # 数值指向p self.sets_count -= 1 # 连通后集合总数减一 def is_connected(self, p, q): """判断pq是否已经连通""" return self.find(p) == self.find(q) # 即判断两个结点是否是属于同一个祖先
参考:https://www.cnblogs.com/yscl/p/10185293.html
时刻记着自己要成为什么样的人!