注意:
union() //union是在判断2个触点(sites)不是连通分量的时候 ,要执行merge操作
组合的时候有个地方需要注意:
获取到2个触点的顶层结点 pID、qID 把id[pID] = qID (改变的是顶层的结点)
比如下图:
p = 5 q = 9 时, id[] = {},
5和9往上找根触点, 5的根是1(用5↑ 表示),9的是8(用9↑ 表示)
需要把id[p=5↑] = id[9↑] (也就是8也就是find(q))。
总结:
- 顶层的触点都是值和索引相等
-
每次修改一位
private int[] parent;
private int count;
public QuickUnionUF(int n){
parent = new int[n];
count = n;
for (int i = 0; i < n; i++) {
parent[i] = i;
}
// System.out.println();
}
public int count() {
return count;
}
public int find(int p){
validate(p);
while(p != parent[p]){
//如果p不等parent[p],则存在父节点(parent[parent[p]])
//直到根节点 根节点可以想成一个指向自己的结点,也就是自环
p = parent[p];
}
return p;
}
// validate that p is a valid index
private void validate(int p) {
int n = parent.length;
if (p < 0 || p >= n) {
throw new IllegalArgumentException("index " + p + " is not between 0 and " + (n-1));
}
}
public boolean connected(int p, int q){
return find(p) == find(q);
}
public void union(int p, int q){
int rootP = find(p);
int rootQ = find(q);
if(rootP == rootQ){
return;
}
parent[rootP] = rootQ;
count--;
}