반응형
Union Find
- Union Find: 그래프에서 두 노드가 같은 집합에 속하는지 판별하는 알고리즘
- 노드를 합치는 union 연산
- 노드가 같은 집합인지 판별하는 find 연산
구조
- unionfind[i]: i번 노드의 부모 노드 정보를 담는다.
- unify(x, y): x번 노드와 y번 노드를 합친다. 이때 unify 이후 둘은 같은 부모 노드를 가리키게 된다.
- same(x, y): x번 노드와 y번 노드가 같은 집합에 있는 지 반환한다.
- find(x): x번 노드의 부모 노드 정보를 반환한다.
- 이때 unionfind[x]를 단순히 반환하는 것이 아닌, unionfind[x]를 업데이트하는 과정을 거침
- 즉, find(x)를 실행하면 unionfind 배열을 업데이트함으로써 더 간결한 트리를 가지게 함
- 재귀함수를 통해 구현하여 찾음과 동시에 부모 노드가 업데이트되도록 함
전체 코드
#include <iostream>
#define MAX 100
using namespace std;
using ll = long long;
ll unionfind[MAX];
ll find(ll x){
if(unionfind[x]==x){
return x;
}
return unionfind[x]=find(unionfind[x]);
}
void unify(ll x, ll y){
ll n1=find(x), n2=find(y);
if(n1<n2){
unionfind[n2]=n1;
}
else{
unionfind[n1]=n2;
}
}
bool same(ll x, ll y){
return (find(x)==find(y));
}
int main(){
}
반응형
'Computer Science > C++' 카테고리의 다른 글
[C++] 벨만포드 알고리즘 (Bellman-Ford Algorithm) (2) | 2024.09.08 |
---|---|
[C++] 세그먼트 트리 (Segment tree) (0) | 2024.08.13 |
[C++] MST (최소신장트리), Kruskal, Prim (0) | 2024.08.01 |