以下代码是使用java实现的pku1611,已经AC,算法具体可以参考并查集那篇。
import java.util.Scanner;
public class pku1611 {
static int f[];
static int r[];
static void Make_Set(int n){
for(int i=0;i f[i]=i;
r[i]=1;
}
}
static int Find_Set(int i){
if(f[i]==i) return i;
f[i]=Find_Set(f[i]);
return f[i];
}
static void Union(int x,int y){
int a=Find_Set(x);
int b=Find_Set(y);
if(a==b) return;
if(r[a]>r[b]){f[b]=a;
r[a]+=r[b];
}
else{
f[a]=b;
r[b]+=r[a];
}
}
public static void main(String argvs[]){
Scanner in=new Scanner(System.in);
int m,n,i,first,num,j,t;
while(in.hasNext()){
n=in.nextInt();
m=in.nextInt();
f=new int[n];
r=new int[n];
if(n==0&&m==0) break;
Make_Set(n);
for(i=0;i<m;i++){
num=in.nextInt();
first=in.nextInt();
for(j=0;j<num-1;j++){
t=in.nextInt();
Union(first,t);
}
}
System.out.println(r[Find_Set(0)]);
}
}
}