본문 바로가기
백준

[백준/C++] 1717 집합의 표현

by MY블로그 2023. 5. 24.
 

1717번: 집합의 표현

초기에 $n+1$개의 집합 $\{0\}, \{1\}, \{2\}, \dots , \{n\}$이 있다. 여기에 합집합 연산과, 두 원소가 같은 집합에 포함되어 있는지를 확인하는 연산을 수행하려고 한다. 집합을 표현하는 프로그램을 작

www.acmicpc.net

대표적인 Union Find 문제 라고 합니다.

해당 알고리즘에대해서 배운적이 없었기때문에 단순히 구조체 배열 구성후

변수 a는 실행조건으로 b, c 는 단순한 구조체 배열에 속한 변수로 하여 문제를 풀려했으나 실패.

다른 풀이를 참고 하도록 합니다.

 

#include <iostream>
#define fastio cin.tie(0)->ios::sync_with_stdio(0); cout.tie(0);
using namespace std;

// 백준 1717번 : 집합의 표현 ( Union Find 문제 )

int r[1000001]; // 제시된 최대 배열
int n, m; // 처음에 입력받을 정수 2개

int getParent(int num) { 
    if (r[num] == num) // 최상단 부모 노드 라면 반환 (함수 탈출)
        return num; 
    else {
        return r[num] = getParent(r[num]); // 없다면 재귀호출
    }
}

void join(int a, int b) { // a가 속한 곳을 b가 속한 곳으로 변경
    r[getParent(a)] = getParent(b);
}

int main()
{
    fastio;
    cin >> n >> m;

    for (int i = 0; i <= n; i++) // 0 ~ n 까지 
        r[i] = i; // r[] 을 자기 자신으로 초기화.

    while (m--)
    {
        int cmd, a, b;

        cin >> cmd >> a >> b;
        if (a == 0) // 0 이라면
            join(a, b); // a가 속한 곳을 b가 속한 곳으로 수정
        else { // 0 이아니라면 즉. 1이라면
            if (getParent(a) == getParent(b)) 
                cout << "YES\n"; // YES 출력
            else // 없다면
                cout << "NO\n"; // NO 출력 
        }
    }
    return 0;
}

Union_Find 정보 참고 블로그

https://gmlwjd9405.github.io/2018/08/31/algorithm-union-find.html

 

[알고리즘] Union-Find 알고리즘 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

'백준' 카테고리의 다른 글

[백준/C++] 1874 스택수열  (0) 2023.06.13
[백준/C++] 1976 여행 가자  (0) 2023.05.30
[백준/C++] 14888 연산자 끼워넣기  (1) 2023.05.21
[백준/C++] 1912 연속합  (0) 2023.05.18
[백준/C++] 14425 문자열 집합  (0) 2023.05.15

댓글