这个题就是并查集模版。
#include<bits/stdc++.h>
using namespace std;
int n, m, k;
const int maxn = 10010;
int fa[maxn] = {0}, cnt[maxn] = {0};
set<int> stCnt, stTree;
int findFather (int x) {
int a = x;
while (x != fa[x])
x = fa[x];
//压缩路径
while (a != fa[a]) {
int z = a;
a = fa[a];
fa[z] = x;
}
return x;
}
void Union (int a, int b) {
int faA = findFather(a);
int faB = findFather(b);
if (faA != faB) {
fa[faA] = faB;
}
}
void init () {
for (int i = 1; i <= maxn; i++)
fa[i] = i;
}
bool exist[maxn];
int main() {
int n, k, a, b;
scanf ("%d", &n);
init();
for (int i = 0; i < n; i++) {
scanf ("%d %d", &k, &a);
stCnt.insert(a);
for (int j = 1; j < k; j++) {
scanf ("%d", &b);
Union (a, b);
a = b;
stCnt.insert(b);
}
}
for (auto it : stCnt) {
int root = findFather(it);
stTree.insert(root);
}
scanf ("%d", &k);
printf ("%d %d\n", stTree.size(), stCnt.size());
for (int i = 0; i < k; i++) {
scanf ("%d %d", &a, &b);
printf ("%s\n", fa[a] == fa[b] ? "Yes" : "No");
}
}
这篇博客详细介绍了并查集的基本操作,包括路径压缩和union函数,并通过实例展示了其在解决集合连接问题中的应用。在示例中,博主读取一系列操作,用并查集维护集合的联通状态,并最终输出集合的树结构大小和元素数量。同时,博客还包含了对给定查询的判断,以检验两个元素是否在同一集合内。
3967

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



