思路:最简单的并查集应用
分析:在输入的时候把在同一个集合里面的元素全部合并起来,然后最后在找有几个元素和0的根节点相同即可。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 30010;
int n , m;
int num[MAXN];
int father[MAXN];
void init(){
for(int i = 0 ; i <= n ; i++){
father[i] = i;
num[i] = 1;
}
}
int find(int x){
if(x != father[x])
father[x] = find(father[x]);
return father[x];
}
int main(){
int k , x;
while(scanf("%d%d" , &n , &m) && n+m){
init();
while(m--){
scanf("%d" , &k);
int root;
for(int i = 0 ; i < k ; i++){
scanf("%d" , &x);
if(i == 0)
root = find(x);
else{
int fx = find(x);
if(fx != root){
father[fx] = root;
num[root] += num[fx];
}
}
}
}
printf("%d\n" , num[find(0)]);
}
return 0;
}