
1. 지금까지 정리
- 최소 신장 트리는 어떤 무방향 가중치 그래프가 주어졌을 때, 그 그래프의 모든 정점을 연결하면서, 가중치의 합이 최소가 되는 간선의 부분집합으로 정의했다.
- 최소 신장 트리를 구하는 Generic한 알고리즘은 아래와 같은 과정을 거친다.
- 먼저 A=∅ 인 집합을 선언한다.
- 이 집합 A에 대해 안전한 간선을 하나 찾은 후, 이를 A에 더한다(Union)
- A에 속한 간선의 개수가 N−1개가 될 때 까지 2번을 반복한다.
- 이때 "안전하다(safe)" 라는 개념을 아래와 같이 정의했었다.
- 어떤 MST의 부분집합 A에 대하여 A∪{(u,v)}를 수행할 때 그 결과 역시 어떤 MST의 부분집합이 될 때 이 간선 E(u,v)가 A에 대하여 안전하다(safe) 라고 정의한다.
- 그리고 이 "안전한"간선을 찾기 위해서 필요한 정리를 알아보기 위해 용어 정리를 수행하였다. 각 용어의 정의는 아래와 같다.
- 어떤 그래프 G=(V,E)가 있을 때, 그래프의 정점들을 두 개의 집합 S와 V−S로 분할한 것을 컷 (S,V−S)라고 부른다.
- 어떠한 간선 E(u,v)에 대하여, u∈S이고, v∈(V−S)일 때 E(u,v)는 컷 (S,V−S)를 cross한다 라고 정의한다.
- 간선들의 부분집합 A에 속한 어떤 간선도 컷 (S,V−S)를 cross 하지 않을 때 컷 (S,V−S)는 간선들의 부분집합 A를 존중한다(respect)라고 정의한다.
- 그리고 "안전한" 간선을 찾는 정리는 아래와 같았다.
- 임의의 컷 (S,V−S)가 존재하고 이 임의의 컷이 어떤 MST의 부분집합 A를 respect 할 때, 컷 (S,V−S)를 cross하는 간선 중 그 가중치가 가장 적은 간선은 A에 대해 safe하다.
2. Kruskal 알고리즘
- Kruskal 알고리즘은 위에서 설명한 Generic MST 알고리즘을 구체화한 알고리즘이다. 해당 알고리즘은 매우 심플한데 대략적인 과정은 다음과 같다.
- 어떤 MST의 부분집합 A를 선언한다. 이때 A=∅ 이다.
- 이후 모든 간선들을 가중치에 대해 오름차순으로 정렬한다.(sorting)
- 이후 간선들을 그 순서대로 하나씩 선택한다. 이때 이미 선택된 간선들과 연결되었을 때 사이클을 형성한다면 선택하지 않는다.
- 선택된 간선의 수가 N−1개가 될 때 까지 3번을 수행한다.
- 보면 위에 있는 Generic MST와 거의 유사하다. 차이점이라면 safe한 간선을 찾는 것을 구체화시켜놓은 것이다.
- 여기에선 모든 간선들을 가중치에 대해 오름차순으로 정렬하므로, 안전한 간선을 찾는 정리를 만족시킨다.
- 이때 연결시켰을 때, 사이클이 형성되는지를 살펴보게 되는데 어떤 방식으로 사이클이 만들어지는걸 감지하는지는 조금 뒤에 알아보도록 하자.
- 여기서 유의해야 할 것은 "안전한" 간선을 찾는 것과. 이 간선을 선택해서 사이클이 발생하는것을 찾는 것은 별개의 문제이다. 즉 안전한 간선이지만 그것을 선택함으로서 사이클이 발생할 수 있다.
- 그림으로 어떻게 수행하는지를 살펴보자

- MST의 부분집합 A를 선언하였다.
- 이후 모든 간선들을 가중치에 대해 오름차순으로 정렬한다.(sorting)
- 이제 정렬한 간선들을 하나씩 선택해보자. 처음 1의 가중치를 가지는 E(8,7)을 선택한다. 해당 간선을 선택함으로서 부분집합 A내부에서 사이클이 발생하지 않는다. 따라서 A={A∪E(8,7)}을 수행한다.
- 이후 2를 가지는 간선 E(7,6)을 선택한다. 해당 간선을 선택함으로서 사이클이 발생하지 않는게 명확하다. 따라서 동일하게 A={A∪E(7,6)}를 수행한다.
- 이후 2를 가지는 간선 E(9,3)을 선택한다. 역시 해당 간선을 선택함으로서 사이클이 발생하지 않는게 명확하다. 따라서 동일하게 A와 합친다.
- 이후 4를 가지는 간선 E(2,1), E(6,3)을 선택한다. 둘 다 선택함으로서 사이클이 발생하지 않으므로 A에 포함시킬 수 있다.
- 여기까지 진행한 후의 그래프는 아래와 같다. 진한 색으로 칠해진 간선들이 A에 속해있는 간선들이다.

- 다음 6의 가중치를 가지는 간선 E(9,7)을 선택해보자. 해당 간선을 선택할 경우에, A 내부에서 사이클이 발생한다. 따라서 해당 간선은 적합하지 않으므로 다음으로 이어진다.
- 이후에 선택되는 7의 가중치를 가진 E(9,8)도 동일하다. 사이클이 발생하기 때문에 선택해서는 안된다.
- 이후에 선택되는 7의 가중치를 가진 간선 E(4,3)을 보자. 선택해도 사이클이 발생하지 않기 때문에 A에 포함시킬 수 있다.
- 이후에 선택되는 8의 가중치를 가진 간선들 E(8,1)은 선택해도 사이클이 발생하지 않는다. 따라서 A에 포함시킬 수 있다. 하지만 그 다음 선택되는 간선 E(3,2)는 선택할 경우 사이클이 발생해 선택할 수 없다.
- 사실 이것은 반대로 E(3,2)를 먼저 선택할 경우 E(8,1)은 선택될 수 없다. 즉 MST는 유일하지 않다.
- 여기까지 진행하면 아래 그림과 같게 된다.

- 9의 가중치를 가지는 간선 E(5,4)를 보자. 해당 간선을 A에 포함시켜도, 사이클이 발생하지 않는다. 따라서 해당 간선을 A에 포함시키고, 정점의 수가 N일 때, N−1개의 간선인 8개의 간선을 모두 선택하였으므로 알고리즘을 종료한다.
- 최종적인 MST의 부분집합 A는 다음과 같을 것이다.

3. 정리
- Kruskal의 알고리즘의 대략적인 진행 방식을 살펴보았다.
- 현재 아직 설명되지 않은건 어떤 간선 e∈E를 선택할 때, 이 간선을 선택함으로서 사이클이 완성되는지를 어떻게 감지할 수 있는가? 가 있다.
- 다음 글에서 사이클의 감지를 kruskal 알고리즘에서 어떻게 수행하는지에 대해 알아보도록 한다.
'Algorithm > MST' 카테고리의 다른 글
[Disjoint Set] BOJ 25579 터트려라 풍선 (0) | 2023.04.23 |
---|---|
최소 신장 트리(Minimum Spanning Tree) - 5 (0) | 2023.04.09 |
최소 신장 트리(Minimum Spanning Tree) - 4 (0) | 2023.04.09 |
최소 신장 트리(Minimum Spanning Tree)- 2 (0) | 2023.04.08 |
최소 신장 트리(Minimum Spanning Tree) - 1 (0) | 2023.04.07 |