版权声明:本文为博主原创文章,转载请附上源地址。 https://blog.csdn.net/Ema1997/article/details/79813293
#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);
}
}