用简单的并查集水了。。。看到有的题解用的是sum[ra] += sum[rb],这种叫什么名字,不记得了,但是这样肯定比我的好点。
#include <stdio.h>
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int fa[30005];
int get_f(int x)
{
if(x != fa[x]) fa[x] = get_f(fa[x]);
return fa[x];
}
int main()
{
int n, m;
while(scanf("%d%d", &n, &m) != EOF)
{
if(n == 0 && m == 0) break;
for(int i = 0; i <= n; i++) fa[i] = i;
while(m --)
{
int q, pre = -1;
scanf("%d", &q);
while(q--)
{
int a;
scanf("%d", &a);
if(pre == -1)
{
pre = a;
continue;
}
int ra = get_f(pre), rb = get_f(a);
if(ra != rb) fa[ra] = rb;
}
}
int x = get_f(0), cnt = 0;
for(int i = 0; i < n; i++)
if(get_f(i) == x) cnt++;
printf("%d\n", cnt);
}
return 0;
}