
이 포스트에서 다룰 최소 신장 트리(minimum spanning tree, MST) 문제는 매우 유명한 조합론적 최적화 문제입니다. 아마 이 글을 읽으러 들어오셨다면 아무래도 학부 자료 구조나 알고리즘 수업 시간에 이 문제가 어떤 문제인지에 대해서 들어 보셨을 것입니다. 굳이 다시 정의를 해 보자면, 이 문제는 간선마다 비용이 정의된 그래프 위에서 최소의 비용으로 모든 정점을 연결하는 트리를 찾는 문제입니다.
수업 시간에 이 문제를 다루면서 분명 이 문제를 해결하는 알고리즘에 대해서도 함께 배우셨을 것입니다. 적어도 다음 두 알고리즘은 배웠을 텐데, 바로 크루스칼의 알고리즘(Kruskal's algorithm)과 프림의 알고리즘(Prim's algorithm)입니다. 두 알고리즘 모두 한두 문장으로 설명이 가능할 정도로 간단하고 직관적입니다. 크루스칼의 알고리즘은 비용이 작은 간선부터 차례대로 보면서 순환을 만들지 않으면 해에 넣고 보는 알고리즘을 일컬으며, 프림의 알고리즘은 한 정점을 기준으로 그 정점에 연결된 정점과 연결되지 않은 정점을 잇는 간선 중 비용이 가장 작은 것을 매번 취해 가는 알고리즘을 말합니다. 두 알고리즘이 동작하는 것을 곰곰이 생각해 본다면 실지로 MST를 출력한다는 것이 믿기기는 할 것입니다.
다만 직관이 증명은 아닙니다. 세상에는 직관에 반하는 일도 종종 발생하기 마련이죠. 따라서 증명하기 전까지는 알고리즘의 동작이 올바르다고 단정지을 수 없습니다. 이번 포스트에서는 상기한 두 알고리즘이 어째서 진짜 MST를 출력하는 것인지 엄밀하게 보이겠습니다. 이를 위해서는 (알고리즘과는 관련 없이) MST가 갖는 흥미로운 성질인 절단 성질(cut property)에 대해서 먼저 알아야 합니다. 이후 어찌하면 이 성질을 활용하여 크루스칼의 알고리즘과 프림의 알고리즘이 증명될 수 있는지 보도록 하겠습니다.
본문에서 크루스칼의 알고리즘과 프림의 알고리즘의 동작에 대해서 개괄적으로 설명을 할 예정입니다만, 이 글은 두 알고리즘의 정확성(correctness)에 초점이 맞추어져 있는 만큼 수행 시간에 대한 분석은 하지 않습니다. 참고로 프림의 알고리즘은 다익스트라의 알고리즘(Dijkstra's algorithm)과 거의 동일합니다. 게다가 그 알고리즘과 동일한 시간 복잡도를 갖습니다. 관련하여 제 이전 글을 참고하시기 바랍니다.
2021.10.09 - [조합론적 최적화/Shortest path] - 다익스트라의 알고리즘 (Dijkstra's Algorithm)
다익스트라의 알고리즘 (Dijkstra's Algorithm)
최단 경로 문제(shortest path problem)는 가장 유명한 조합론적 최적화 문제 중 하나로, 이름에서 유추할 수 있듯이 다양한 분야에서 널리 활용되는 문제입니다. 지난 포스트에서는 이 문제를 정확히
gazelle-and-cs.tistory.com
반면 크루스칼의 알고리즘은 수행 시간과 관련하여 흥미로운 내용이 많이 있습니다. 다음에 기회가 되면 꼭 포스팅해 볼 수 있도록 하겠습니다.
정의 및 기호
본문에서 사용될 정의와 기호 몇 가지를 소개하겠습니다. 아래에서 열심히 사용되니 잘 숙지하고 본문을 읽는 것을 추천합니다.
[문제의 입력]
먼저 MST 문제의 입력으로는 어떤 방향이 없는(undirected), 연결된(connected) 그래프
[트리, 신장 트리, 신장 트리의 비용]
트리(tree)는 연결된, 순환이 없는(acyclic) 그래프를 말합니다. 입력 그래프
[정점의 분할]
정점의 분할(partition)은 쉽게 말해 모든 정점을 비어 있지 않은 부분 집합으로 나누어 놓은 것을 의미합니다. 엄밀히 말해, 어떤
- 각
에 대해, 이고 - 임의의 두
에 대해,
를 모두 만족한다면, 우리는 이러한
[횡단하는 간선]
어떤 정점의 분할
[존중하는 분할]
반대로 어떤 간선의 부분집합
의 임의의 간선에 대해, 그 양 끝점(endpoint)이 모두 같은 의 한 부분집합에 속한다. 즉, 임의의 에 대해, , 인 가 존재한다.
다시 말해,

절단 성질
서론에서 언급하였듯이 이 글의 목표는 크루스칼의 알고리즘과 프림의 알고리즘을 절단 성질을 이용하여 증명하는 것입니다. 먼저 절단 성질이 무엇인지부터 말씀드리겠습니다.
정리 1. 절단 성질 (cut property)
어떤 MST
위 정리의 명제에서 몇 가지 짚고 넘어갈 부분이 있습니다.
는 의 진부분집합입니다. 만약 라면 이를 존중하는 정점의 분할은 밖에 없습니다. 따라서 이 분할을 횡단하는 간선은 존재하지 않죠. 하지만 라면 이미 그 자체로 MST이므로 굳이 무언가를 더 찾을 필요는 없습니다. 는 꼭 존재합니다. 가 가 아니라면 이 분할을 횡단하는 간선은 반드시 존재해야 합니다. 그렇지 않다면 의 한 부분집합에 속한 정점에서 다른 부분집합에 속한 정점까지 향하는 경로가 존재하지 않게 되며, 이는 입력 그래프가 연결되어 있다는 사실에 위배됩니다. 를 포함할 MST는 가 아닐 수도 있습니다. 이러한 일이 발생할 수 있는 이유는 서로 다른 두 간선이 같은 비용을 가질 수 있기 때문입니다. 그러면 동일한 비용을 갖는 신장 트리가 생길 수 있습니다. 그럼에도 위 정리가 여전히 의미가 있는 이유는 어차피 최종적으로 우리가 출력할 것은 특정 MST가 아닌 아무 MST이기 때문입니다.
정리 1을 증명하기 위해서는 트리와 관련된 몇 가지 보조 정리들이 필요합니다. 첫 번째는 트리의 정의에 의해 성립하는 성질입니다. 아래에서 경로가 단순(simple)하다는 것의 의미는 경로 상에서 한 번 지난 정점을 다시 지나지 않는다는 것을 말합니다.
정리 2. 트리에서 정점 쌍의 경로의 유일성
어떤 트리가 주어졌을 때, 그 위의 두 정점 쌍의 경로는 단순하며 유일하다.
[증명] 만약 두 정점 쌍의 경로가 존재하지 않다면, 트리의 연결성에 위배됩니다. 만약 경로가 단순하지 않다면 한번 지난 정점을 다시 지날 수 있다는 의미이므로 순환이 존재한다는 뜻이고, 이는 트리에 순환이 없다는 성질에 모순이 됩니다. 이번에는 서로 다른 두 정점
다음은 절단 정리의 증명에서 활용할 연산에 대한 내용입니다.
정리 3. 신장 트리 간선 교체 연산
어떤 신장 트리
[증명] 먼저
이제

이제 앞에서 본 정리들을 활용하여 절단 성질을 증명할 수 있습니다.
[정리 1 증명] 만약
먼저, 정리 3에 의해서
MST 알고리즘 증명
이전 절에서는 절단 성질이 무엇인지 알아 보고 어째서 그 성질이 성립하는지를 증명하였습니다. 이제 이 성질을 활용하여 크루스칼의 알고리즘과 프림의 알고리즘이 어째서 MST를 출력하는지를 증명해 보도록 하겠습니다. 이번 포스트에서는 두 알고리즘의 수행 시간에 대해서는 논의하지 않을 예정이므로 아래에서는 알고리즘을 최대한 개괄적으로 기술하였음을 알립니다.
크루스칼의 알고리즘
많은 분들이 대개 알고 있는 크루스칼의 알고리즘은 다음과 같이 동작합니다.
알고리즘 1. 크루스칼의 알고리즘 (Kruskal's algorithm)
입력: 그래프
출력: MST
를 비용의 오름차순으로 정렬한다.- 정렬된
의 각 간선 에 대해 아래를 수행한다. 와 가 의 서로 다른 연결 성분(connected component)에 속해 있으면, 아래를 수행한다.
를 반환한다.
단계 3-a에서는 정점의 집합을
이제 크루스칼의 알고리즘을 분석해 보겠습니다. 이를 위해서 위 알고리즘에 몇 개의 연산을 추가하도록 하겠습니다. 추가된 연산은 빨간색 글씨로 굵게 적었습니다.
알고리즘 2. (가상의 연산이 추가된) 크루스칼의 알고리즘
입력: 그래프
출력: MST
아무 MST 를 비용의 오름차순으로 정렬한다.- 정렬된
의 각 간선 에 대해 아래를 수행한다. 와 가 의 서로 다른 연결 성분(connected component)에 속해 있으면, 아래를 수행한다. 절단 성질로부터 보장된 를 포함하는 어떤 MST 에서 가 속한 연결 성분과 가 속한 연결 성분을 합친다.
를 반환한다.
추가된 연산은 알고리즘 1에 있던 기존 연산에 영향을 주지 않는 것을 확인하시기 바랍니다. 그러므로 알고리즘 1과 알고리즘 2의 출력은 (
알고리즘 2의 동작을 곰곰이 살펴 봅시다.
문제는

단계 5-a-i에서는
정리 4. 를 존중하는
단계 3이 수행된 직후와 매번 단계 5-a를 수행한 후,
[증명] 귀납적으로 보이겠습니다. 기저 경우(base case)로 단계 3이 수행된 직후에는
다음은
정리 5. 최소의 비용을 갖는 횡단 간선
매번 단계 5-a가 수행되려고 할 때의
[증명] 알고리즘에서 우리는
- 이전에 단계 5-a의 조건을 만족한 경우. 이때는 현재의
에 이 포함되어 있습니다. 정리 4에 의해 현재의 는 현재의 를 존중하므로 은 현재의 를 횡단할 수 없습니다. - 이전에 단계 5-a의 조건을 만족하지 못한 경우. 이때는
이 그때의 조차 횡단하지 못했다는 뜻입니다. 우리는 알고리즘에서 를 관리할 때 계속 합치기만 했습니다. 따라서 은 현재의 에서도 횡단 간선이 되지 못합니다.
모든 경우에 대해서
아래는 전체 증명에서 가장 중요한 정리입니다. 이를 증명할 때 이전 절에서 공부한 절단 성질이 드디어 활용됩니다.
정리 6. 를 포함하는 MST
단계 3이 수행된 직후와 매번 단계 5-a를 끝낸 후
[증명] 알고리즘의 진행에 따라 귀납적으로 증명하겠습니다. 단계 3이 수행된 후에는
: 귀납 가정에 의해 어떤 MST입니다. : 귀납 가정에 의해 입니다. 그런데 단계 5-a가 수행되기 위해서는 현재 고려하는 간선 의 양 끝점 , 가 의 서로 다른 연결 성분에 있어야 합니다. 만약 라면 가 신장 트리라는 사실과 정리 2에 의해 그러한 , 는 존재하지 않습니다. 따라서 그때의 는 필시 의 진부분집합이어야 합니다. : 정리 4에 의해서 는 의 연결 성분의 모임입니다. 이는 가 의 진부분집합이라는 사실과 함께 가 가 아니면서 를 존중하는 분할이라는 사실을 도출합니다. : 정리 5에 의해 현재 고려하는 는 를 횡단하는 간선 중 최소의 비용을 갖습니다.
따라서 우리는 단계 5-a를 수행하기 직전의
드디어 위 정리들을 활용하면 크루스칼의 알고리즘이 올바르게 동작한다는 것을 엄밀하게 증명할 수 있습니다.
정리 7. 크루스칼의 알고리즘의 정확성
알고리즘 2는 올바르게 동작한다. 즉, 어떤 MST를 출력한다.
[증명] 먼저 알고리즘 2가 출력하는
정리 6에 의해 우리는 최종적으로 출력하는
프림의 알고리즘
이제 프림의 알고리즘을 절단 성질을 활용하여 증명해 보겠습니다. 우리가 익히 아는 프림의 알고리즘은 개략적으로 아래와 같습니다.
알고리즘 3. 프림의 알고리즘 (Prim's algorithm)
입력: 그래프
출력: MST
- 아무 정점
를 설정한다. - 아래를 총
번 수행한다.
- 한 끝점은
, 다른 끝점은 에 있는 간선 중 비용이 가장 작은 것을 라고 한다. 일반성을 잃지 않고 , 이라고 하자.
- 한 끝점은
를 반환한다.
크루스칼의 알고리즘을 증명할 때에도 그랬던 것처럼 가상의 연산을 아래와 같이 추가하도록 하겠습니다. 추가된 연산은 위와 동일하게 빨간색 글씨로 굵게 적었습니다.
알고리즘 4. (가상의 연산이 추가된) 프림의 알고리즘
입력: 그래프
출력: MST
- 아무 정점
를 설정한다. 아무 MST- 아래를 총
번 수행한다.
- 한 끝점은
, 다른 끝점은 에 있는 간선 중 비용이 가장 작은 것을 라고 한다. 일반성을 잃지 않고 , 이라고 하자. 절단 성질로부터 보장된 를 포함하는 어떤 MST
- 한 끝점은
를 반환한다.
추가된 연산은 기존의 단계에 영향을 주지 않으므로 위 두 알고리즘은 동일하게 동작합니다. 또한

증명은 크루스칼의 알고리즘에서보다 간단한 편입니다. 절단 성질의 조건이 알고리즘의 동작에서 곧장 유도되는 경우가 많기 때문입니다. 먼저
정리 8. 를 포함하는 MST
단계 5가 수행된 직후 및 단계 6을 한 번씩 수행할 때마다
[증명] 귀납적으로 증명하겠습니다. 기저 경우로 단계 5가 수행된 후
: 귀납 가정에 의해 어떤 MST입니다. : 귀납 가정에 의해 입니다. 간단한 귀납법으로 단계 6을 그동안 번 수행했으면 그때의 는 를 만족함을 알 수 있습니다. 이번에 단계 6을 수행한다는 것은 아직 라는 뜻입니다. 따라서 입니다. : 알고리즘의 동작을 잘 살펴 보면 은 결국 에서 의 간선을 이용하여 도달 가능한 정점의 집합과 동일합니다. 그러므로 의 모든 간선은 를 횡단하지 않습니다. : 단계 6-a로부터 가 를 횡단하는 간선 중 가장 작은 비용을 갖는 간선임을 곧장 알 수 있습니다.
그러므로 절단 성질을 적용하면,
이제 프림의 알고리즘의 정확성을 증명할 수 있습니다.
정리 9. 프림의 알고리즘의 정확성
알고리즘 4는 올바르게 동작한다. 다시 말해, 어떤 MST를 반드시 출력한다.
[증명] 먼저 알고리즘이 어떤 연결된 부분 그래프를 출력함을 보이겠습니다. 정리 8의 증명에서 논의한 바와 같이 간단한 귀납법을 통해서 우리는
마치며
이번 글에서는 MST가 만족하는 흥미로운 특징인 절단 성질에 대해서 공부하고 이를 활용하여 잘 알려진 MST 알고리즘인 크루스칼의 알고리즘과 프림의 알고리즘을 각각 증명해 보았습니다. 특히 절단 성질은 중복된 비용이 있는 경우에도 동작하는 아주 강력한 성질입니다.예전에 보루프카의 알고리즘(Borůvka's Algorithm)에 관한 글을 적었었는데, 그때는 분석할 때 비용이 서로 다르다고 가정했었습니다. 그러면 그래프의 MST는 유일하기 때문입니다. 하지만 절단 성질을 사용한다면 해당 가정이 없어도 보루프카의 알고리즘을 증명할 수 있지 않을까 생각합니다.
이 글을 적으면서 스스로 복습하겠다는 마음이 전혀 없었던 것은 아닙니다. 실제로 본문을 적을 때 교과서를 참고하지 않고 예전에 공부했던 내용을 상기해 가면서, 약간씩 막힐 때는 스스로 직접 증명해 가면서 적었기 때문입니다. 하지만 그 이유보다는 MST를 공부하시는 분들에게 도움이 되고 싶은 마음이 더 컸다고 생각합니다. 수업 시간에 MST 알고리즘의 증명을 배우지 않는다면, 이 글을 통해서 증명은 어떤 식으로 이루어지는지 알아 가셨으면 합니다. 반대로 증명을 다룬다면, 높은 확률로 헤매고 계시리라 생각하는데, 이 글에서 힌트를 얻어 가셨으면 하는 바람입니다.
MST와 관련하여 흥미로운 주제가 조금 더 있습니다. 기회가 되면 포스팅해 보도록 하겠습니다. 읽어주셔서 고맙습니다.
'조합론적 최적화 > Minimum spanning tree' 카테고리의 다른 글
보루프카 알고리즘 (Borůvka's Algorithm) (0) | 2021.01.20 |
---|