공부혜옹

백준 1043번 거짓말 본문

공부합시다/Algorithm

백준 1043번 거짓말

Blair06 2021. 7. 27. 01:33
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

int n, m, t; // 문제의 수, 문제에 대한 정보의 개수
int parent[51];
int party[51][51];
int can;

vector<int> knowTrue;

int find (int x) {
    if(x == parent[x]){
        return x;
    }
    return x = find(parent[x]);
}

void unionset (int x, int y) {
    x = find(x);
    y = find(y);
    parent[x] = y;
}

int check(int i) {
    for (int j = 0; j < t; j++) {
        //진실된 사람 있으면
        if (find(party[i][0]) == find(knowTrue[j])) {
            can--;
            return 0;
        }
    }
    return 0;
}
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> n >> m >> t;

    //진실을 알고있는 사람들
    if(t == 0){
        //진실을 아는사람이 없을때
        cout << m;
        
        return 0;
    } else {
        for(int i=0; i<t; i++){
            int a;
            cin >> a;
            
            knowTrue.push_back(a);
        }
    }
    for (int i = 0; i < n; i++) {
        parent[i] = i;
    }
    for (int i = 0; i < m; i++) {
        //몇명올지
        int p;
        cin >> p;
        cin >> party[i][0];
        for(int j=1; j<p; j++){
            cin >> party[i][j];
            unionset(party[i][0],party[i][j]);
        }
    }
    
    can = m;
    for (int i = 0; i < m; i++) {
    check(i);
    }
    cout << can << '\n';

    return 0;
}
반응형

'공부합시다 > Algorithm' 카테고리의 다른 글

백준 2133 타일 채우기  (0) 2021.08.16
백준 11057 오르막 수  (0) 2021.08.15
백준 1052번 물병  (0) 2021.07.13
백준 1766번 문제집  (0) 2021.06.08
백준 2252번 줄세우기  (0) 2021.06.08
Comments