题目URL:http://poj.org/problem?id=1611
我是用的并查集求解,另外用了添加集合元素时用了路径压缩,这样查找集合代表元素是可以时间更快。
这是我的AC代码,欢迎拍砖。
#include<iostream>
#include<stdio.h>
using namespace std;
const int Max = 30000 + 10;
int set[Max];
int size[Max];
int root(int i)
{
while(set[i] != -1) i = set[i];
return i;
}
void unionTree(int &r1, int &r2)
{
if(r1 == r2) return ;
if(size[r1] > size[r2])
{
set[r2] = r1;
size[r1] += size[r2];
r2 = r1;
}
else
{
set[r1] = r2;
size[r2] += size[r1];
r1 = r2;
}
}
int main()
{
int n, m, num, a, b, r1, r2;
while(scanf("%d%d", &n, &m) && (n || m))
{
for(int i=0; i<n; i++) set[i] = -1, size[i] = 1;
for(int i=0; i<m; i++)
{
scanf("%d", &num);
scanf("%d", &a);
r1 = root(a);
for(int j=1; j<num; j++)
{
scanf("%d", &b);
r2 = root(b);
unionTree(r1, r2);
}
}
printf("%d\n", size[root(0)]);
}
system("pause");
return 0;
}