코드
#include <iostream>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
int n, m, known, kc[53], tmp, cnt, hum, res, lst[53], visited[53];
vector<vector<int>> pe;
// U-F? dfs?
int find(int x) {
if (x == lst[x]) return x;
return lst[x] = find(lst[x]);
}
void merge(int x, int y) {
x = find(x);
y = find(y);
if (x > y) lst[x] = y;
else lst[y] = x;
}
int main() {
cin >> n >> m;
cin >> known;
for (int i = 0; i < 53; i++) lst[i] = i;
// 진실을 아는 사람
for (int i = 0; i < known; i++) {
cin >> tmp;
lst[tmp] = 0;
}
// 파티에 오는 사람
for (int i = 0; i < m; i++) {
cin >> cnt;
vector<int> t;
for (int j = 0; j < cnt; j++) {
cin >> hum;
t.push_back(hum);
}
pe.push_back(t);
for (int j : t) merge(t[0], j);
}
// 이후 파티 개수 판별
for (int i = 0; i < pe.size(); i++) {
bool check = true;
for (int j : pe[i]) {
if (find(j) == 0) {
check = false;
break;
}
}
if (check) res++;
}
cout << res << '\n';
return 0;
}
풀이