Think:
1知识点:并查集
2思考:可否过程运行中得到每一个集合的元素数目
以下为Accepted代码
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 3e4 + 4;
int n, m, f[N];
void Init();
int get_f(int x);
void Merge(int u, int v);
int main(){
int i, k, u, v, ans;
while(scanf("%d %d", &n, &m) && (n != 0 || m != 0)){
ans = 0;
Init();
while(m--){
scanf("%d", &k);
if(k)
scanf("%d", &u);
for(i = 1; i < k; i++){
scanf("%d", &v);
Merge(u, v);
}
}
for(i = 0; i < n; i++){
if(get_f(i) == get_f(0))
ans++;
}
printf("%d\n", ans);
}
return 0;
}
void Init(){
for(int i = 0; i < n; i++)
f[i] = i;
}
void Merge(int u, int v){
int t1 = get_f(u);
int t2 = get_f(v);
f[t2] = t1;
}
int get_f(int x){
if(f[x] == x)
return f[x];
else {
f[x] = get_f(f[x]);
return f[x];
}
}