并查集_路径压缩
并查集原理概念
并查集是一种用于管理元素所属集合的数据结构,实现为一个森林,其中每棵树表示一个集合,树中的节点表示对应集合中的元素。
支持两种操作:
- 合并(Unite):合并两个元素所属集合(合并对应的树)。
- 查询(Find):查询某个元素所属集合(查询对应的树的根节点),这可以用于判断两个元素是否属于同一集合。如果不需要考虑查询的路径,只需要考虑最总的祖先节点,那么可以查询的时候进行路径压缩,就是把让路径上的所有节点都指向祖先节点。
详细见:OI WIKI 并查集
代码实现:
class UnionFind:def __init__(self, n):self.fa = [range(n)]def find(self, i):while i != self.fa[i]:i = self.fa[i]return i# 路劲压缩def find(self, i):# 递归栈实现if i != self.fa[i]:self.fa[i] = self.find(self.fa[i])return self.fa[i]# 非递归实现# j = i# while i != self.fa[i]:# i = self.fa[i]# father = i# i = j# while i != self.fa[i]:# i = self.fa[i]# self.fa[i] = father# return fatherdef merge(self, i, j):self.fa[self.find(i)] = self.find(j)