Union Find
2017-11-02 本文已影响0人
王鑫鑫_d516
class Main {
static class UnionFind {
private int [] father;
UnionFind(int n) {
father = new int[n];
// init with their index
for (int i = 0; i < n; ++ i) {
father[i] = i;
}
}
//a: employer
//b: employee
public void union(int a, int b) {
int fa = find(a);
int fb = find(b);
if (fa != fb) father[fb] = father[fa];
}
public int find(int a) {
if (a == father[a]) return a;
return father[a] = find(father[a]);
}
}
public static void main(String[] args) {
// 1. Simulator of input
int [][] input = new int[][]{
{'A', 'B'},
{'B', 'C'},
{'C', 'D'}
};
int m = input.length;
int n = input[0].length;
System.out.println(m + "\n"+ n);
for (int i = 0; i < m; ++ i) {
for (int j = 0; j < n; ++ j) {
System.out.println((char)(input[i][j]));
}
}
// 2. Def union find
int ASCII_SIZE = 256;
// 0 1 2 ... 65(A) 66(B) ... 255
// 0 1 3 ... 65(A) 66(B) ... 255
UnionFind uf = new UnionFind(ASCII_SIZE);
// 3. Union
for (int i = 0; i < m; ++ i) {
uf.union(input[i][0], input[i][1]);
}
// 4. Ouptut
// the input[0][0] can be any one which is valid
System.out.println(uf.find(input[2][1]));
}
}