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