#define LEN 100
int arr[LEN];
void init(int* &arr) {
for(int i=0; i<LEN; ++i) arr[i] = i;
}
int find(int x) {
while(x != arr[x]) x = arr[x];
return x;
}
void unite(int p, int q) {
p = find(p);
q = find(q);
if(p != q) arr[p] = q;
}
常见优化方法:
#define LEN 100
int arr[LEN];
int size[LEN];
void init(int* &arr) {
for(int i=0; i<LEN; ++i) {
arr[i] = i;
size[i] = 1;
}
}
int find(int x) {
while(x != arr[x]) x = arr[x];
return x;
}
void unite(int p, int q) {
p = find(p);
q = find(q);
if(p != q) {
if(size[p] > size[q]) { // “小集合”合并到“大集合”
arr[q] = p;
size[p] += size[q];
} else {
arr[p] = q;
size[q] += size[p];
}
}
}