본문 바로가기

baekjoon

1043번 거짓말

https://www.acmicpc.net/problem/1043

 

1043번: 거짓말

지민이는 파티에 가서 이야기 하는 것을 좋아한다. 파티에 갈 때마다, 지민이는 지민이가 가장 좋아하는 이야기를 한다. 지민이는 그 이야기를 말할 때, 있는 그대로 진실로 말하거나 엄청나게

www.acmicpc.net

UF문제이다. 나는 파티에 거짓말 아는 친구가 있으면 -1로 부모값을 바꿔 계산해주었다.

 

#include <bits/stdc++.h>
#define all(v) v.begin(), v.end()
#define INF 2e9
#define F first
#define S second
using namespace std;

typedef long long l;
typedef pair<int,int> p;
typedef tuple<int,int,int> tu;
typedef vector<int> vc;

unordered_map<int,int> root;
bool check[51];

int Find(int x){
    if(root[x] == x) return x;
    else return root[x] = Find(root[x]);
}

void Union(int x,int y){
    x = Find(x), y = Find(y);

    if(x == y) return;

    if(x < y) root[y] = x;
    else root[x] = y;
}

int main() {
    ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);

    int n,m,k,a;

    cin >> n >> m >> k;

    for(int i=1;i<=n;i++)
        root[i] = i;

    vc save[51];

    for(int i=0;i<k;i++){
        cin >> a;
        check[a] = true;
        root[a] = -1;
    }
    root[-1] = -1;

    for(int z=0;z<m;z++){
        cin >> k;

        for(int i=0;i<k;i++){
            cin >> a;
            if(check[a]) save[z].push_back(-1);
            else save[z].push_back(a);
        }

        int size = int(save[z].size());

        for(int i=0;i<size-1;i++)
            Union(save[z][i],save[z][i+1]);

    }

    int temp = m;

    for(int i=0;i<temp;i++)
        if(Find(save[i][0]) == -1) m--;

    cout << m;


}

'baekjoon' 카테고리의 다른 글

1261번 알고스팟  (0) 2022.04.24
3197번 백조의 호수  (0) 2022.04.21
1395번 스위치  (0) 2022.04.17
3078번 좋은 친구  (0) 2022.04.16
16496번 큰 수 만들기  (0) 2022.04.15