并查集(Disjoint Set)是一种数据结构,用于解决一些集合相关的问题。它主要支持以下两种操作:
-
查找(Find):确定一个元素属于哪个集合。通常以某个集合中的一个元素作为代表来标识整个集合。
-
合并(Union):将两个不相交的集合合并为一个集合。
主要应用包括:
-
判断无向图中是否存在环:可以通过判断每条边的两个顶点是否属于同一个集合来判断是否存在环。
-
连通性问题:可以用并查集来判断两个节点是否连通,即它们是否属于同一个集合。
-
图的最小生成树算法(如Kruskal算法):在构建最小生成树时,可以使用并查集来判断当前加入的边是否会形成环。
-
社交网络中的好友关系:可以使用并查集来表示社交网络中的好友关系,并进行快速的查找和合并操作。
-
图像分割:可以使用并查集来实现图像分割算法,将图像中的像素点按照颜色或其他属性进行分组。
JAVA语言,并查集精简模板:
public class ConcurrentSearch {
// n是可定义的并查集数
private int n;
private int[] father;
// 构造函数——初始化
public ConcurrentSearch(int n) {
this.n = n;
father = new int[n];
for (int i = 0; i < n; i++) {
father[i] = i;
}
}
// 查找
public int find(int u) {
return u == father[u] ? u : (father[u]=find(father[u])); // father[u]=find(father[u])保证及时更新根节点
}
// 合并
public void join(int u, int v) {
u = find(u);
v = find(v);
if (u != v) father[v] = u; // v的父节点被更替为u,加入并查集u的树
}
// 判断是否是同一个根节点
public boolean same(int u, int v) {
return find(u) == find(v);
}
}
练习题,源于代码随想录的题目,路指Leetcode:
684
685