package com.snail.basic;
/*
-
触点-->对象称之为触点
-
分量-->等价类称为连通分量简称分量
-
等价关系-->相连称之为等价
-
*/
public class WeightedQuickUnilnUF {
private int[] id; //父链接数组(由触点索引)
private int[] sz; //各个根结点所对应分量的大小
private int count; // 连通分量的数量public WeightedQuickUnilnUF(int N) {
count = N;
id = new int[N];
for (int i = 0; i < N; i++) {
id[i] = i;
}
sz = new int[N];
for (int i = 0; i < N; i++) {
sz[i] = 1;
}
}public int count() {
return count;
}public boolean connected(int p, int q) {
return find(p) == find(q);
}public int find(int p) {
while (p != id[p]) {
p = id[p];
}
return p;
}// 加权quick-union的深度最多为logN
public void union(int p, int q) {
int i = find(p);
int j = find(q);
if (i == j) return;
// 将小树的根结点连接到大树的根结点
if (sz[i] < sz[j]) {
id[i] = j;
sz[j] += sz[i];
} else {
id[j] = i;
sz[i] += sz[j];
}
count--;
}
}
网友评论