思路:最简单的并查集应用
分析:在输入的时候把在同一个集合里面的元素全部合并起来,然后最后在找有几个元素和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; }