POJ_1611,并查集算法例题,由于没有压缩路径故leader[stu]是stu的直接leader 。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int leader[30000];
int findleader(int stu){
if(stu==leader[stu]) return stu;
leader[stu]=findleader(leader[stu]);
return leader[stu];
}
int main(){
while(1){
int n,m;
scanf("%d%d",&n,&m);
if(!n&&!m) return 0;
int count=0;
for(int i=0; i<n; i++) leader[i]=i;
for(int i=0; i<m; i++){
int groupsize,groupleader;
scanf("%d%d",&groupsize,&groupleader);
for(int j=1; j<groupsize; j++){
int stu;
scanf("%d",&stu);
//把该学生之前所属的最终leader的leader赋值为当前组的leader
leader[findleader(stu)]=findleader(groupleader);
}
}
for(int i=0; i<n; i++) if(leader[findleader(i)]==leader[0]) count++;
printf("%d\n",count);
}
}