题意介绍
有若干小团体,每个小团体由若干个人,求一个人感染,导致直接或间接感染的总人数。
题意分析
利用并查集的思想,先将每个每个人视为一个独立的团体,然后根据输入将这些团体进行合并,并记录每个大团体的人数。
通过代码
#include<iostream>
using namespace std;
int n, m;
int par[30005], rnk[30005];
int find(int x) {
if (par[x] == x) return x;
else return par[x] = find(par[x]);
}
void unite(int x, int y) {
x = find(x);
y = find(y);
if (x == y) return;
if (rnk[x] > rnk[y]) swap(x, y);
par[x] = y, rnk[y] = (rnk[x] += rnk[y]);
}
int main() {
while (cin >> n >> m && (n!=0 || m!=0)) {
for (int i = 0; i < n; i++) {
par[i] = i;
rnk[i] = 1;
}
int num,p,q;
for (int i = 0; i < m; i++) {
cin >> num;
cin >> p;
for (int j = 1; j < num; j++) {
cin >> q;
unite(p, q);
}
}
cout << rnk[find(0)] << endl;
}
}