题目链接 http://poj.org/problem?id=2236
#include<cstdio> using namespace std; int n,m; int pre[50005]; void Init(){ for(int i = 0;i < n;i++) pre[i] = i; } int Find(int x){ //找到祖先 int t = x; while(pre[t] != t) t = pre[t]; return t; } void Union(int x,int y){ 合并 int xx = Find(x); int yy = Find(y); if(xx != yy){ pre[xx] = yy; } } int main(){ int num; int first; int later; while(scanf("%d%d",&n,&m) != EOF){ if(n == 0 && m == 0) break; Init(); for(int i = 1;i <= m;i++){ scanf("%d",&num); scanf("%d",&first); for(int j = 2;j <= num;j++){ scanf("%d",&later); Union(first,later); } } int sum = 1; int flag = Find(0); for(int i = 1;i < n;i++){ if(Find(i) == flag) sum++; } printf("%d\n",sum); } return 0; }