http://poj.org/problem?id=1611
Description
Input
Output
Sample Input
100 4 2 1 2 5 10 13 11 12 14 2 0 1 2 99 2 200 2 1 5 5 1 2 3 4 5 1 0 0 0
Sample Output
4 1 1
并查集的介绍大家还是google吧,我只会贴代码,见谅啊~
#include <iostream>
using namespace std;
int father[30001]; //存储father index
int group[30001]; //存储当前 集合的人数
//初始化
void init(int len) {
for (int i = 0; i <= len; i++){
father[i] = i;
group[i] = 1;
}
}
//查找i的最终father
int find_set(int i){
if(i != father[i]){
father[i] = find_set(father[i]); //路径压缩
}
return father[i];
}
//合并两个点
void join(int x,int y){
int i = find_set(x);
int j = find_set(y);
if(i != j){
father[i] = father[j];
group[j] += group[i]; //合并时,由于最终father保存当前集合人数
}
}
int main() {
int n,m,k;
while( cin >> n >> m){
if(n == 0)
break;
init(n); //初始化
for(int i=0; i<m; i++){
cin >> k;
int pre,cur; //前一个 和 当前
for(int j=0; j<k; j++){
cin >> cur;
if(j) //第一个数不用管
join(pre,cur);
pre =cur;
}
}
//测试
// for(int i=0; i<n; i++)
// cout << father[i] << " ";
// cout << endl;
//
// for(int i=0; i<n; i++)
// cout << group[i] << " ";
// cout << endl;
//
// cout << find_set(0) << endl;
cout << group[find_set(0)] << endl;
}
return 0;
}
#include <stdio.h>
int father[30001]; //存储father index
int group[30001]; //存储当前 集合的人数
//初始化
void init(int len) {
for (int i = 0; i <= len; i++) {
father[i] = i;
group[i] = 1;
}
}
//查找i的最终father
int find_set(int i) {
int temp = i;
while (temp != father[temp]) {
temp = father[temp];
}
father[i] = temp;
return temp;
// if(i != father[i]){
// father[i] = find_set(father[i]); //路径压缩
// }
// return father[i];
}
//合并两个点
void join(int x, int y) {
int i = find_set(x);
int j = find_set(y);
if (i != j) {
father[i] = father[j];
group[j] += group[i]; //合并时,由于最终father保存当前集合人数
}
}
int main() {
int n, m, k;
while (scanf("%d %d", &n, &m) != EOF) {
if (n == 0)
break;
init(n); //初始化
for (int i = 0; i < m; i++) {
scanf("%d", &k);
int pre, cur; //前一个 和 当前
for (int j = 0; j < k; j++) {
scanf("%d", &cur);
if (j) //第一个数不用管
join(pre, cur);
pre = cur;
}
}
//测试
// for(int i=0; i<n; i++)
// cout << father[i] << " ";
// cout << endl;
//
// for(int i=0; i<n; i++)
// cout << group[i] << " ";
// cout << endl;
//
// cout << find_set(0) << endl;
printf("%d\n", group[find_set(0)]);
}
return 0;
}