알고리즘/탐색

합집합 찾기(Union-Find)

Dero Lee 2021. 12. 25. 01:16
728x90

 

서로소 집합 알고리즘 : 여러 개의 노드가 존재할 때 두 개의 노드를 선택해서, 현재 이 두 노드가 서로 같은 그래프에 속하는지 판별.

 

(1) 자기 자신을 부모로 가진다.

(2) A,B가 연결되어 있을 때 더 작은 값을 부모로 합친다 (Union)

(3) A,B,C가 연결되어 있을 때 재귀함수를 이용해서 가장 작은 값인 A로 부모를 지정한다.(Union-Find)

 

Find 알고리즘 : 두 개의 노드의 부모 노드를 확인하여 현재 같은 집합에 속하는지 확인하는 알고리즘.

 

 

 

 

Union-Find는 최소 비용 신장 트리를 만들기 위한 알고리즘인 Kruskal 알고리즘에 주로 사용됨.

 

//부모 노드를 찾는 함수 

int getParent(int parent[], int x){

    if(parent[x] == x) return x;

    return parent[x] = getParent(parent, parent[x]);

}

//두 부모 노드를 합치는 함수

int unionParent(int parent[], int a, int b){

    a = getParent(parent, a);
    b = getParent(parent, b);

    if(a < b) parent[b] = a;
    else parent[a] = b;

}

// 같은 부모를 가지는지 확인

int findParent(int parent[], int a, int b){

    a = getParent(parent, a);
    b = getParent(parent, b);

    if(a==b) return 1;

    return 0;

}

 

728x90