#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn = 30010;
int par[maxn];
int n, m;
int get_par(int a)
{
if (par[a] != a) {
par[a] = get_par (par[a]);//一定是a的父亲是a的父亲的根不要写错
}
return par[a];
}
int query(int a, int b)
{
return get_par (a) == get_par (b);
}
void Merge(int a, int b)
{
par[get_par(a)] = get_par(b);
}
void Init()
{
for (int i = 0 ;i < n; i++) {
par[i] = i;
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen ("in.txt", "r", stdin);
#endif // ONLINE_JUDGE
while (scanf ("%d%d", &n, &m) != EOF) {
if (n == 0 && m == 0) break;
Init ();
for (int i = 0; i < m; i++) {
int k, a;
scanf ("%d%d", &k, &a);
for (int j = 1; j < k; j++) {
int b;
scanf ("%d", &b);
Merge (a, b);
}
}
int num = 1;
for (int i = 1; i < n; i++) {
if (query (0, i)) {
num++;
}
}
printf ("%d\n", num);
}
}
POJ - 1611(并查集)
最新推荐文章于 2022-03-03 22:06:14 发布
本文详细介绍了并查集算法的基本概念、实现原理及其在解决实际问题中的应用。通过具体的代码示例展示了如何初始化并查集、查找元素所属集合以及合并两个集合的操作。适用于初学者理解和掌握并查集算法。
&spm=1001.2101.3001.5002&articleId=79813293&d=1&t=3&u=224f69666a734dd8937d92060dcc54a5)
1124

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



