http://acm.pku.edu.cn/JudgeOnline/problem?id=1611 题目 详细代码如下:思路很清晰. #include <iostream> using namespace std; int parent[30005];//保存人编号的父亲 int Find(int i) { if (i!=parent[i]) parent[i]=Find(parent[i]); return parent[i]; } void Union(int i,int j) { parent[j]=i; } int main () { int n,m,k,i,j,count,a,b; while (cin>>n>>m) { if (n==0 && m==0) break; for (i=0;i<n;i++)//初始化父亲 parent[i]=i; count=0;// for (i=1;i<=m;i++) { cin>>k; cin>>a; a=Find(a); for (j=2;j<=k;j++) { cin>>b; b=Find(b); if (a!=b) { Union(a,b); } } } int res=Find(0);//找出有0这个人的父亲 for (i=0;i<n;i++) { if (res==Find(i)) count++; } cout<<count<<endl; } return 0; }