1.什么叫并查集
n个不同元素被分为若干组。每组是一个集合,这种集合叫分离集合,称之为并查集(disjoint-set)。
2.并查集的算法实现
树实现方法
0.创建树
const N = 1000010;
int parent[N];
int rank[N];
void make_size(int n){
int i;
for(i = 1; i <= n; i++){
parint[i] = i;
rank[i] = 1;
}
}
1.查找树根
int findRoot(int x){
if(x == parent)
return x;
int r =findRoot(parent[x]);///1
parent[x] = r;
return r;
}
int findRoot_iter(int x) {
int r = x;
while (r != parent[r])
r = parent[r]; //找树根
int i = x, j;
while (i != r) { //路径压缩
j = parent[i];
parent[i] = r;
i = j;
}
return r;
}
}
2.合并两树
void union_set(int x, int y) {
int px = findRoot(x);
int py = findRoot(y);
if (px != py) {
parent[px] = py;
}
}
void union_iter(int x, int y) {
int px = findRoot(x);
int py = findRoot(y);
if (px != py) {
if (rank[px] < rank[py])
parent[py] = py;
else {
parent[py] = px;
if(rank[px] == rank[py])
rank[px]++;
rank[px] += rank[py];
}
}
}
3.函数实现
int main() {
int n, m;
scanf("%d%d", &n, &m);
make_set(n);
for (int i = 1; i <= m; i++) {
int x, y;
scanf("%d%d", &x, &y);
union_set(x, y);
}
int q;
scanf("%d", &q);
for (int i = 1; i <= q; i++) {
int x, y;
scanf("%d%d", &x, &y);
int px = findRoot(x);
int py = findRoot(y);
if (px == py)printf("Yes\n");
else printf("NO\n");
}
retrun 0;
}