并查集(Union-find Sets)是一种非常精巧而实用的数据结构,它主要用于处理一些不相交集合的合并问题。并查集的基本操作有以下3个:
- init(s):初始化一个新的并查集,其中包含 s 个单元素集合。
- union(x, y):把元素 x 和元素 y 所在的集合合并,要求
x 和 y 所在的集合不相交,如果相交则不合并 - find(x):找到元素 x 所在的集合的代表,该操作也可以用于判断两个元素是否位于同一个集合,只要将它们各自的代表比较一下就可以了。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
class uf():
def __init__(self,n):
self.count=n#连通分量个数
self.parent=[i for i in range(n)]#存储一棵树
self.size = [1 for i in range(n)]#记录树的数量
#查找
def find(self,x):
while self.parent[x]!=x:
x=self.parent[x]
return self.parent[x]
#合并
def union(self,x,y):
xp=self.find(x)
yp=self.find(y)
if xp==yp:
return
if self.size[xp]>self.size[yp]:
self.parent[yp]=xp
self.size[xp]+=self.size[yp]
else:
self.parent[xp] = yp
self.size[yp] += self.size[xp]
self.count-=1