본문 바로가기
공부/C++

[C++] Union-Find 알고리즘

by 기찬이즘 2024. 6. 24.
반응형

 

Union-Find 알고리즘은 중복되지 않은 원소들로 이루어진 집합들을 표현할 때 사용하는 알고리즘이다.

아래와 같이 간단하게 구현할 수 있는 자료구조로, 코딩테스트에서는 중복되지 않는 id를 가지는 집들이 있을 때, 거리별로 마을이 만들어진다던가 하는 문제에서 활용하기 좋다.

#include <iostream>
using namespace std;

int parents[11];

void init() {
    for (int i = 1; i <= 10; ++i)
        parents[i] = i;
}

void printOutput() {
    for (int i = 1; i <= 10; ++i)
        cout << parents[i] << " ";
    cout << "\n";
}

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

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

    if (a < b)
        parents[b] = a;
    else
        parents[a] = b;
}

int main() {
    init();
    printOutput();
    union_(1,10);
    union_(10,8);
    union_(2,9);
    printOutput();
    union_(8,2);
    printOutput();

}

출력값은 

1 2 3 4 5 6 7 8 9 10 
1 2 3 4 5 6 7 1 2 1  
1 1 3 4 5 6 7 1 2 1

으로, 1번 노드와 10번 노드, 10번 노드와 8번 노드, 2번 노드와 9번 노드가 합쳐졌을 때 각각 부모노드는 1번, 2번으로 잘 합쳐진 것을 확인할 수 있다.

최종적으로 1번 노드와 연결된 8번 노드를 2번노드와 합쳐 줌으로써 2번 노드의 부모노드도 1번 노드가 되었다.

반응형