알고리즘 문제 해결/BOJ

[Union-find] BOJ 1717 집합의 표현

jmkimmessi 2022. 8. 23. 00:00
반응형

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

 

1717번: 집합의 표현

첫째 줄에 n(1 ≤ n ≤ 1,000,000), m(1 ≤ m ≤ 100,000)이 주어진다. m은 입력으로 주어지는 연산의 개수이다. 다음 m개의 줄에는 각각의 연산이 주어진다. 합집합은 0 a b의 형태로 입력이 주어진다. 이는

www.acmicpc.net

 

문제 해결 알고리즘

 

Union find 문제

 

parent 배열이 무조건 그 노드의 조상노드를 가리키는 게 아니기 때문에 조상 노드 비교 해줄 때는 find_parent 함수를 써줘야한다.

 

 

소스 코드

 

#include <bits/stdc++.h>
using namespace std;

int n, m;
int parent[1000001];

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

void unionVertex(int a, int b){

    a = find_parent(a);
    b = find_parent(b);

    if(a == b) return;
    else parent[a] = b;
    
}

int main(){
    ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    cin >> n >> m;

    for(int i=0;i<=n;i++) parent[i] = i; 

    int k, a, b;
    for(int i=0;i<m;i++){
        cin >> k >> a >> b;

        if(k == 0) {
            if(a == b) continue;
            if(a > b) swap(a, b);
            unionVertex(a, b);
        }
        else {
            if(find_parent(a) != find_parent(b)) cout << "NO\n";
            else cout << "YES\n";
        }
    }
}
반응형