简介
参考链接
并查集是一种树形的数据结构,用于处理不相交集合的合并和查询问题。在判断连通图个数、朋友圈个数等有重要应用。
并查集主要涉及三个基本操作:
- makeSet(n):初始化一个独立的集合,开始时每个元素的最高祖先为自身 parent[x]=x;
- findSet(x):寻找x所在集合的最高祖先,通过递归的方式进行查询,并且在查询时进行路径压缩。例如:开始有一个集合中1->2->3->4这种关系,当执行findSet(1)时的步骤依次是findSet(1) = findSet(2) = findSet(3) = findSet(4) = 4,一遍执行完成后,1,2,3元素的祖先节点都指向4;
- unionSet(x,y):将元素x和元素y所在的集合进行合并,如果x,y在一个集合中就不用合并了,如果不在一个集合中,只需要将x元素的祖先指向y元素的祖先即可。例如两个集合1->2,3->4,如果将两个集合合并则只需2->4即可。
通过上面三个函数即可将所有有关系的节点连接在一起。下面是简单的代码实现。
// 并查集简单实现
import java.util.*;
public class UFSet {
// 保存祖先节点
int[] parent;
public UFSet(int n){
parent = new int[n+1];
}
// 初始化,每个元素是一个独立子集,祖先是自己
public void makeSet(int n ){
for(int i = 1; i <= n; i++){
parent[i] = i;
}
}
// 递归的方式找到x的祖先节点
public int findSet(int x){
if(parent[x] == x){
return x;
}
parent