package com.interview.algorithms.general;
/**
* Created_By: zouzhile
* Date: 4/8/14
* Time: 9:20 AM
* <p/>
* See: http://algs4.cs.princeton.edu/15uf/
* <p/>
* The implementation is actually Weighted quick-union version
*/
public class C1_3_UnionFind {
private int N = 0;
private int[] parents;
private int[] unionSizes;
private int unionsCount;
public C1_3_UnionFind(int N) {
this.N = N;
parents = new int[N];
for (int i = 0; i < N; i++) parents[i] = i;
unionSizes = new int[N];
for (int i = 0; i < N; i++) unionSizes[i] = 1;
this.unionsCount = N;
}
/**
* This is actually returning the root of the union
*
* @param p
* @return
*/
public int find(int p) {
while (p != this.parents[p]) p = this.parents[p];
return p;
}
public boolean connected(int p, int q) {
return this.find(p) == this.find(q);
}
/**
* Weighted quick union
*
* @param p
* @param q
*/
public void union(int p, int q) {
int pRoot = this.find(p);
int qRoot = this.find(q);
if (pRoot == qRoot) return;
if (unionSizes[pRoot] < unionSizes[qRoot]) { // attaching small union to large union
this.parents[pRoot] = qRoot;
this.unionSizes[qRoot] += this.unionSizes[pRoot];
} else {
this.parents[qRoot] = pRoot;
this.unionSizes[pRoot] += this.unionSizes[qRoot];
}
this.unionsCount--;
}
public int count() {
return this.unionsCount;
}
}