Disjoint set
static int parent[], rank[];
static int find(int u) {
if (u == parent[u]) {
return u;
}
return parent[u] = find(parent[u]);
}
static void merge(int u, int v) {
u = find(u);
v = find(v);
if (u == v) {
return;
}
// u - > v merging
// tree depth 낮은게 높은 tree로 가야 tree depth가 변하지 않는다
if (rank[u] > rank[v]) {
// cording을 편하게 하기 위해
//swap(u, v);
int temp = u;
u = v;
v = temp;
}
parent[u] = v;
if (rank[u] == rank[v]) {
rank[v]++;
}
}