并查集
并查集模板
// 该模板结合了size和rank和优化,使用时自取即可
class DSU {
// p : parents数组
// sz:size数组,代表的是当前圈子里的数量
// rank:rank数组,用于合并时降低树的高度
int[] p, sz, rank;
DSU(int N) {
p = new int[N];
for(int i = 0; i < N; i++)
p[i] = i;
sz = new int[N];
Arrays.fill(sz, 1);
rank = new int[N]; // rank初始值是0
}
// 递归降低树的高度
public int find(int x) {
if (p[x] != x)
p[x] = find(p[x]);
return p[x];
}
public void union(int x, int y) {
int xr = find(x);
int yr = find(y);
if(xr == yr) return;
if(rank[xr] > rank[yr]){
p[yr] = xr;
sz[xr] += sz[yr];
} else if(rank[xr] < rank[yr]){
p[xr] = yr;
sz[yr] += sz[xr];
} else {
p[xr] = yr;
rank[yr]++;
sz[yr] += sz[xr];
}
}
public int size(int x) {
return sz[find(x)];
}
}