并查集模板
int parent[n];
int size[n];
for(i = 0; i < n; i++) {
parent[i] = i;
size[i] = 1;
}
int find(int a) {
assert a >= 0 && a < n
int parenta = parent[a];
while(parenta != parent[parenta]) {
parent[parenta] = parent[parent[parenta]];
parenta = parent[parenta];
}
return parenta;
}
BOOL isConnected(int a, int b) {
return (find(a) == find(b));
}
void union(int p, int q) {
int p_parent = find(p);
int q_parent = find(q);
if (p_parent != q_parent) {
if (p_parent < q_parent) {
parent[p_parent] = q_parent;
} else if (p_parent > q_parent) {
parent[q_parent] = p_parent;
} else {
parent[q_parent] = p_parent;
size[p_parent]++;
}
}
}