最初将每个元素初始化为一个集合,每次输入记录它的前一个值,找出前一个值的根和当前输入的根,将他们合并,并用一个ans[] 记录以当前元素值为根的集合元素总个数,全部输入合并之后,find(0)找到0的根ans[root]即为所求。 #include <stdio.h> int pre[30005],ans[30005]; //ans[]记录以此元素为根的树共多少元素 int n,m,k,temp,p,root; int find(int x){ while(x!=pre[x]) x=pre[x]; return x; } void Union(int x,int y){ int r1=find(x),r2=find(y); if(r1==r2) return; else { if(r1>r2){ //将编号值大的元素连接到编号值小的元素上 pre[r1]=r2; ans[r2]+=ans[r1]; } else { ans[r1]+=ans[r2]; pre[r2]=r1; } } } int main(){ while(scanf("%d%d",&n,&m)&&(n!=0||m!=0) ){ for(int i=0;i<n;++i){ //initial pre[i]=i; ans[i]=1; } for(int i=0;i<m;++i){ scanf("%d",&k); for(int j=0;j<k;++j){ //输入用P记录该输入的前一个元素,将它们合并 scanf("%d",&temp); if(j==0) p=temp; else { Union(p,temp); p=temp; } } } root=find(0); //调用查找操作找出含0的树的根,ans[root]为所求结果 printf("%d/n",ans[root]); } return 0; }