并查集主要包含两个方法
- int find(int x) 查找x所在集合的代表元
- void join(int x, int y) 合并x和y所在的两个集合
其中实现查找和合并的算法有多种,可自行进行查阅。并查集中的路径压缩和按秩合并。
整体算法和数据结构还是比较好理解的,后面写相关的算法能应用才是更重要的。
/**
* 并查集
* @author Eric
*
*/
public class UnionFindDisjointSets {
/**
* pre[x] = y 表示x的前继节点是y
*/
private int[] pre;
public UnionFindDisjointSets() {
pre = new int[1000];
}
public UnionFindDisjointSets(int[] pre) {
this.pre = pre;
}
/**
* 寻找元素x所在集合的代表元
* @param x
* @return 代表元
*/
public int find(int x) {
if(pre[x] != x) {
pre[x] = find(pre[x]);
}
return pre[x];
}
/**
* 将x和y所在的两个集合进行合并
* @param x
* @param y
*/
public void join(int x, int y) {
int m1 = find(x);
int m2 = find(y);
pre[m1] = m2;
}
}