并查集是一种用于维护集合的数据结构,通常用于解决图论中的一些算法问题,如判断连通性、最小生成树等。
以下为并查集的基本操作:
以下是并查集的实现示例,使用了路径压缩和按秩合并优化:
class DisjointSetUnion:
def __init__(self, n):
self.parent = list(range(n))
self.rank = [0] * n
def find(self, x):
if self.parent[x] != x:
self.parent[x] = self.find(self.parent[x])
return self.parent[x]
def merge(self, x, y):
px, py = self.find(x), self.find(y)
if px != py:
if self.rank[px] > self.rank[py]:
self.parent[py] = px
elif self.rank[px] < self.rank[py]:
self.parent[px] = py
else:
self.parent[py] = px
self.rank[px] += 1
def same(self, x, y):
return self.find(x) == self.find(y)
这里给出了一个最基础的并查集实现,时间复杂度为O(mα(m, n)),其中m为操作次数,n为元素个数。其中α为Ackermann函数的逆函数,其
上一篇:并不总是可能接受一个答案。