并查集模版题,把同一俱乐部的放入同一个集合,最后统计和0在同一个集合的数字
#include<iostream>
#include<cstdio>
#include<string.h>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = 100000 + 50;
int n, m;
int member[maxn];
int group[maxn];
int p[maxn];
void maketree()
{
for (int i = 0; i <= n; i++)
p[i] = i;
}
int Find(int x)
{
if (x != p[x])
return p[x] = Find(p[x]);
return p[x];
}
void unite(int x, int y)
{
int p1 = Find(x);
int p2 = Find(y);
p[p2] = p1;
}
int main()
{
while (cin >> n >> m && (n || m))
{
maketree();
for (int i = 0; i < m; i++)
{
int k;
cin >> k;
int id;
cin >> id;
if (p[id] != id)
id = Find(id);
for (int i = 1; i < k; i++)
{
int t;
cin >> t;
if (p[t] != t)
unite(t, id);
else
p[t] = id;
}
}
int tmp = p[0];
int cnt = 0;
for (int i = 0; i <= n; i++)
{
if (tmp == Find(i))
cnt++;
}
cout << cnt << endl;
}
return 0;
}