POJ - 1611The Suspects(并查集)
并查集。
将每个组的学生进行合并,最后 \(0\) 号学生所在集合的学生个数即为答案。
#include <cstdio>
#include <vector>
using namespace std;
/**
* Disjoint Set Union
*/
class DSU
{
vector<int> s;
int cnt;
public:
DSU(int n) {
cnt = n;
s.resize(n+1);
for (int i = 1; i <= n; ++i) s[i] = i;
}
int find(int x) {
if (x != s[x]) s[x] = find(s[x]);
return s[x];
}
bool unite(int u, int v) {
int x = find(u);
int y = find(v);
if (x != y) {
s[y] = x;
--cnt;
return true;
}
return false;
}
int getCnt() {
return cnt;
}
};
int main()
{
int n, m;
while (~scanf("%d%d", &n, &m)&&(n|m)) {
DSU dsu(n);
while (m--) {
int k;
scanf("%d", &k);
if (k == 0) continue;
int u;
scanf("%d", &u);
--k;
while (k--) {
int v;
scanf("%d", &v);
dsu.unite(u+1,v+1);
}
}
int ans = 0;
for (int i = 1; i <= n; ++i) {
if (dsu.find(i) == dsu.find(1)) ++ans;
}
printf("%d\n", ans);
}
return 0;
}