less than 1 minute read

[BOJ/백준] 1717번 : 집합의 표현

BOJ 1717

Alt text

Alt text

문제 해석

  • 이 문제에서는 초기 상태에서는 독립적인 집합을 이루고 있다가 입력으로 합집합 연산으로 두 집합을 병합을 한다. 또한 두 원소가 같은 집합에 포함되어있는지 확인하는 연산 또한 필요하다. 즉, 전형적인 유니온 파인드 문제임을 알 수 있다.

유니온 파인드란?

풀이

  • 유니온 파인드 알고리즘에 대해 알고있다면, 그대로 사용만하면 풀리는 문제이다.

코드

#include <iostream>
#include <vector>
using namespace std;

static vector<int> parent;
void unionfunc(int a, int b); //union 연산 함수
int find(int a); // 어느 집합에 속하는지 확인하는 함수(대표 노드 반환)
bool checkSame(int a, int b);//두 집합이 같은지 확인하는 함수

int main(void){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int N, M;
    cin>>N>>M;
    parent.resize(N+1);

    for(int i=0; i<=N; i++){
        parent[i]=i; // 각 노드의 대표 노드는 자기 자신으로 초기화
    }
    for(int i=0; i<M; i++){
        int question, a, b;
        cin>>question>>a>>b;

        if(question==0){
            unionfunc(a, b);
        }
        else{
            if(checkSame(a,b)){
                cout<<"YES"<<"\n";
            }
            else{
                cout<<"NO"<<"\n";
            }
        }
    }
}

void unionfunc(int a, int b){
    a=find(a);
    b=find(b);

    if(a!=b){
        parent[b]=a;
    }
}

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

bool checkSame(int a, int b){
    a=find(a);
    b=find(b);

    if(a==b){ //두 원소의 대표 노드가 같다면
        return true;//같은 집합에 속함
    }
    return false;//그렇지 않음
}