一、定义
并查集主要用于不同集合之间互相合并,查找的问题。
数据结构:树
因此我们要构建一个数组pre[ ]来存储元素的前驱节点。
0.pre[ ]
pre[x]代表x的前驱节点
当 pre[x]==x 代表x为根节点
pre = [i for i in range(n)] #对pre进行初始化
#令每一个元素的前驱节点都为它本身
#即每个元素都为根节点
# P S :可以根据不同的题目选择更便捷的初始化
并查集由两个功能构成:并和查
Ⅰ.并 - join()函数
功能:合并两个节点
def join(x,y):
fx=find(x) #查找x的根节点
fy=find(y) #查找y的根节点
if fx != fy : #x,y根节点不相同则进行合并
pre[fx]=fy
return 0
Ⅱ.查 - find()函数
功能:查找节点的根节点
def find(x):
while pre[x] != x: #判断x是for为根节点
x=pre[x]
return x #返回根节点
优化
当x有众多前驱节点,那么寻找根节点会耗费大量时间和重复运算
那么我们可以在一次寻找过程中,把所有查找过程中出现的直接连到根节点
def find(x):
record=[] #记录查找过程中的x
while pre[x] != x:
record.append(x) #x入队
x=pre[x]
for i in range(len(record)):
pre[record[i]]=x #record中所有值的前驱节点指向根节点
return x
二、总结
容易出错的地方:pre[x]的下标
因为很多题目的标号是从 1 开始,未处理容易导致 out of range