用并查集解决合并问题。
#include<vector>
#include<cstdio>
#include<cstring>
#include<set>
#define maxn 10010
using namespace std;
int root[maxn];
int maxone = 0;
int findroot(int r) {
int x = root[r];
while (x != root[x]) {
x = root[x];
}
return x;
}
int main() {
int n, a;
scanf("%d", &n);
memset(root, -1, maxn);
while(n--) {
int r, t;
scanf("%d", &a);
scanf("%d", &r);
if (r > maxone) maxone = r;
int temproot;
if (root[r] == -1) {
root[r] = r;
temproot = r;
}
else temproot = root[r];
a--;
while(a--) {
scanf("%d", &t);
if (t > maxone) maxone = t;
if (root[t] == -1) root[t] = temproot;
else {
int d = findroot(t);
root[d] = temproot;
}
}
}
for (int i = 1; i <= maxone; i++) {
if (root[i] != -1) {
root[i] = findroot(i);
}
}
set<int> s;
for (int i = 1; i <= maxone; i++) {
if (root[i] != -1) s.insert(root[i]);
}
printf("%d %d\n", s.size(), maxone);
int k;
scanf("%d", &k);
while(k--) {
int b, c;
scanf("%d %d", &b, &c);
if (root[b] == root[c]) printf("Yes\n");
else printf("No\n");
}
}

本文深入探讨了并查集算法的实现与应用,通过具体代码示例,详细讲解了如何利用并查集解决复杂的合并问题,包括数据结构的初始化、查找根节点、合并集合等关键操作。
372

被折叠的 条评论
为什么被折叠?



