http://acm.pku.edu.cn/JudgeOnline/problem?id=1611
#include "stdio.h"
#include "stdlib.h"
#include <iostream>
using namespace std;
const int MAXSIZE = 30002;
int parent[MAXSIZE]; //记录父节点
int num[MAXSIZE]; //记录节点所在集合的元素的个数
void initial(int n){
for(int i=0;i<n;i++){
parent[i] = i; //初试化,每个元素为一个集合
num[i] = 1;
}
}
//寻找根节点
int findparent(int x){
int r = x;
while(r!=parent[r]){
r = parent[r];
}
return r;
}
//合并两个集合 a,b分别是两个集合的根,用根代表集合
void unionset(int a,int b){
if(a==b){
return;
}
//小集合并到大集合里
if(num[a]<num[b]){
parent[a] = b;
num[b] = num[b] + num[a];
}else{
parent[b] = a;
num[a] = num[b] + num[a];
}
}
int main(){
freopen("data.txt","r",stdin);
int n,m;
int a,b;
int i,k;
while(scanf("%d %d",&n,&m)&&n+m!=0){
initial(n);
while(m-->0){
scanf("%d",&k);
scanf("%d",&a);
for(i=1;i<k;i++){
scanf("%d",&b);
int roota = findparent(a);
int rootb = findparent(b);
unionset(roota,rootb); //合并两个集合
}
}
int root = findparent(0);
printf("%d/n",num[root]);
}
return 0;
}