public static void Main()
Console.WriteLine("Hello World");
private int[] parent, rank;
public UnionFind(int n) {
for (int i = 0; i < n; i++) {
parent[p] = parent[parent[p]];
public void union(int p, int q) {
if (rootP == rootQ) return;
if (rank[rootQ] > rank[rootP]) {
if (rank[rootP] == rank[rootQ]) {
public int findCircleNum(int[][] M) {
UnionFind uf = new UnionFind(n);
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (M[i][j] == 1) uf.union(i, j);