/*
[1,1,0],
[1,1,0],
[0,0,1]]
*/
class Solution {
public int findCircleNum(int[][] isConnected) {
if (isConnected == null || isConnected.length == 0) {
return 0;
}
UnionFind uf = new UnionFind();
int m = isConnected.length;
int n = isConnected[0].length;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (isConnected[i][j] == 1) {
uf.add(i); // ็กๅๅ, ๅฟ
้ ๅ้ๅ
uf.add(j);
uf.union(i, j);
}
}
}
return uf.getNumOfSet();
}
}
class UnionFind {
private Map<Integer, Integer> parent;
private int numOfSet = 0;
UnionFind() {
this.parent = new HashMap<>();
}
public void add(int x) {
if (parent.containsKey(x)) {
return;
}
parent.put(x, null);
numOfSet++;
}
public int find(int x) {
int root = x;
while (parent.get(root) != null) {
root = parent.get(root);
}
while (x != root) {
int xParent = parent.get(x);
parent.put(x, root);
x = xParent;
}
return root;
}
public void union(int x, int y) {
int rootX = find(x);
int rootY = find(y);
if (rootX != rootY) {
parent.put(rootX, rootY);
numOfSet--;
}
}
public boolean isConnected(int x, int y) {
return find(x) == find(y);
}
public int getNumOfSet() {
return numOfSet;
}
}