前言
并查集
一、并查集
并查集一共可以分为三步:
1.初始化
2.合并
3.查询
首先是初始化:
![](https://i-blog.csdnimg.cn/blog_migrate/009d138c510bc065ba87ad6508adcd9c.png)
def init(length:int)->List[int]:
return list(range(length))
用一个数组parent 来表示 parent[i] = j 表示 i的先辈是j。初始化是parent[i] = i,表示自己是自己的先辈。
接着是合并,例如3是4的先辈,2又是3的先辈。1又是2 的先辈 间接可以得出1又是4的先辈:如下图
![](https://i-blog.csdnimg.cn/blog_migrate/e45e7d711a61ef459c391ed50cac0dbc.png)
合并就是根据需要合并的条件,将节点union起来。
def union(index1:int,index2:int):
parent[find(index1)] = find(index2)
最后是查询。其实查询与合并几乎是同时进行的,查询是寻找当前节点的先辈。如果新的节点连接起来,那么当前节点的的先辈,就要变换啦,变换为新的先辈。查询过程也是递归查询,代码如下:
#find 找该节点的祖先
def find(index:int)->int:
if parent[index]!=index:
parent[index] = find