/*并查集(union-find sets)*/
#include <iostream>
using namespace std;
const int MAXN = 30005;
int n, m;
int father[MAXN], RANK[MAXN];
void init() {
for (int i = 0; i < n; ++i) {
father[i] = i;
RANK[i] = 1;
}
return;
}
int find_root(int x)
{
if (x != father[x]) {
father[x] = find_root(father[x]);
}
return father[x];
}
void Union(int x, int y)
{
x = find_root(x);
y = find_root(y);
if (x == y) return;
if (RANK[x] >= RANK[y]) {
father[y] = x;
RANK[x] += RANK[y];
}
else {
father[x] = y;
RANK[y] += RANK[x];
}
}
int main()
{
while (cin >> n >> m && (n + m)) {
init();
int k, first, next;
for (int i = 0; i < m; ++i) {
cin >> k >> first;
for (int j = 1; j < k; ++j) {
cin >> next;
Union(first, next);
}
}
cout << RANK[father[0]] << endl;
}
return 0;
}
POJ1611 The Suspects
最新推荐文章于 2018-04-08 21:18:25 发布