정리 정리 시즌... 다시 다시 하는 시즌..자주 나오진 않는 거 같지만, 꼭 까먹었을 때 나오길래..ㅎㅎ
합 집합 찾기 == 서로소 찾기
- 여러개의 노드가 존재할 때, 두 개의 노드를 선택해, 현재 이 두 노드가 서로 같은 그래프에 속하는지 판별하는 알고리즘 이다.
부모 노드를 업데이트 해 간다.
- a, b 노드가 속해 있는 두 서브 그래프를 합치면서, a, b 의 부모 노드를 업데이트한다
ex) 더 작은 숫자의 노드가 항상 부모노드라고 한다면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) {
if(getParent(a) == getParent(b)) return 1;
return 0;
}
int getParent(int parent[], int x ) {
if(parent[x] == x) return x; // 현재노드가 이 그래프의 루트노드인 경우 바로 리턴한다
return getParent(parent, parent[x]); // 재귀호출을 통해, 현재 이 노드가 속한 그래프 상에서 가장 상위 노드를 리턴한다
}
위에서 재귀함수 부분에서 효율을 높일 수 있음. ㅎㅅㅎ.
지금은, a-b-c-d-e 까지 depth 가 있는 그래프에서 b 에서부터 시작해서 한 번 getParent() 를 호출했더라도, c 에서 또 찾으면 또 그 탐색 과정을 하나하나 거쳐야함.
int getParent(int parent[], int x ) {
if(parent[x] == x ) return x;
return parent[x] = getParent(parent[x]);
}
하나를 업데이트 해 가는 과정에서, 루트 노드를 세팅하였기 때문에, 다음번 getParent 호출은 바로 If 에서 리턴되어온다.
가장 적은 비용으로 모든 노드를 연결하기 위해 사용하는 알고리즘이다