Algorithm/상호 배타적 집합

Union-Find algorithm

jhg0406 2020. 1. 30. 01:57
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//최적화된 상호 배타적 집합의 구현
 
//트리를 이용해 상호 배제적 집합을 구현한다
struct OptimizedDisjointSet
{
    vector<int> parent, rank;
    OptimizedDisjointSet(int n) : parent(n), rank(n, 1)
    {
        for(int i = 0; i<n; ++i)
            parent[i] = i;
    }
    //u가 속한 트리의 루트의 번호를 반환한다.
    int find(int u)
    {
        if(u == parent[u]) return u;
        return parent[u] = find(parent[u]);
    }
    //u가 속한 트리와 v가 속한 트리를 합친다
    void merge(int u, int v)
    {
        u = find(u); v = find(v);
        //u와 v가 이미 같은 집합에 속하는 경우를 걸러낸다
        if(u == v) return;
        if(rank[u] > rank[v]) swap(u, v);
        //이제 rank[v]가 항상 rank[u]이상이므로 u를 v의 자식으로 넣는다
        parent[u] = v;
        if(rank[u] == rank[v]) ++rank[v];
    }
};
cs

 

 

 

 

 

Union-Find

상호 배타적 집합

 

 

 

 

시간복잡도

평균 O(α(n))

α(n) 은 애커만 함수로 우리가 상상할 수 있는 모든 n에 대하여 4 이하의 값을 가짐

 

 

 

 

프로그래밍 대회에서 배우는 알고리즘 문제해결전략 2