一、概念
并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题(即所谓的并、查)。比如说,我们可以用并查集来判断一个森林中有几棵树、某个节点是否属于某棵树等。
主要构成:
并查集主要由一个整型数组pre[ ]和两个函数find( )、join( )构成。
数组 pre[ ] 记录了每个点的前驱节点是谁(一般理解为该点的爸爸是谁),函数 find(x) 用于查找指定节点 x 属于哪个集合(可以理解为找祖先),函数 join(x,y) 用于合并两个节点 x 和 y(一般是将x认作是y的爸爸) 。
作用:
并查集的主要作用是求连通分支数(如果一个图中所有点都存在可达关系(直接或间接相连),则此图的连通分支数为1;如果此图有两大子图各自全部可达,则此图的连通分支数为2……)。
举例:
例如一个大陆有天、地、玄、黄四个门派,每个门派有不同级别的弟子若干,pre[ ] 数组就是记录每个弟子的上司名字,而find() 方法就是找到该弟子上司的上司的上司…即所属门派的掌门人,join(A, B) 方法就是将A弟子设置为B弟子的上司。
二、python实现完整版代码
完整版的并查集数据结构有初始化、find、merge等方法,主要是方便理解,一般解题是不用完整版,因为代码量冗余增加时间空间复杂度。
class UnionFind:
def __init__(self):
self.father = {
} ##记录每个节点的父节点
def find(self, x):
root = x
while self.father[root] != root: #寻找根节点
root = self.father[root]
while root != x: #路径压缩
preFather = self.father[x]
self.father[x] = root
x = preFather
return root
def merge(self, x, y): #合并节点
root_x, root_y = self.find(x), self.find(y)
if root_x != root_y:
self.father[root_x] = root_y
def is_connected(self, x, y): #判断联通性
return self.find(x) == self.find(y)
def add(self