
자동차를 타고 서울에서 부산까지 여행을 떠난다고 생각해 봅시다. 일분일초라도 여행을 더 즐기기 위해서는 빨리 목적지에 도달하는 것이 좋겠죠. 그러려면 어떤 경로를 따라 자동차를 운전해야 할까요? 한 가지 방법으로는 서울에서 부산까지 가는 모든 경로를 따져 본 다음, 가장 빨리 도달할 수 있는 경로를 선택하는 것입니다. 하지만 이 방법은 한눈에 봐도 멍청하다는 것을 알 수 있습니다. 서울에서 부산까지 가는 경로는 엄청나게 많기 때문입니다.
여기서 곰곰이 생각해 보면, 우리는 모든 경로를 다 탐색할 필요가 없어 보입니다. 예를 들어, 서울에서 부산까지 가는데 굳이 둘러 둘러 광주를 경유할 필요는 없겠죠. 반대로 서울과 부산의 가운데 정도에 위치한 대전은 지나는 것이 좋을 것입니다. 과연 어떻게 하면 효율적으로 경유할 장소를 판단할 수 있을까요?
실생활에서 쉽게 접할 수 있는 위 예시를 컴퓨터과학에서는 최단 경로 문제(shortest path problem)로 정형화 하였습니다. 이번 포스트에서는 이 문제가 무엇이고, 어떻게 하면 다항 시간에 이 문제를 해결할 수 있는지 함께 알아 보도록 하겠습니다.
문제 정의
최단 경로 문제는 다음과 같이 정의됩니다. 문제의 입력으로는 어떤 방향이 있는 그래프(directed graph)

입력으로 주어지는 그래프

이제 문제의 목표를 알아보겠습니다. 우리는 모든 정점
서두에서 소개한 예시에서는 부산이라는 특정한 도착지가 있었습니다. 하지만 문제의 목표에서는 도착지를 따로 두지 않았죠. 그렇지만 어차피 모든 정점에 대한 최단 경로를 구할 수 있다면, 어느 특정 도착지로 가는 최단 경로도 바로 구할 수 있습니다. 따라서 지금 푸는 문제가 더 일반적인 문제라는 사실을 알 수 있습니다.
아래에서 사용할 기호를 소개하겠습니다.
- 어떤 경로의 간선의 개수를 경로의 길이라고 말하겠습니다. 반대로 어떤 경로의 간선의 비용을 모두 더한 것을 경로의 비용이라고 부르겠습니다. 순환에 대해서도 동일한 방식으로 부릅니다.
- 어떤 경로
가 주어졌을 때, 이것의 비용은 라고 표현하겠습니다. 순환이 주어졌을 때도 해당 순환의 비용을 비슷한 기호로 표현합니다. - 임의의 정점
에 대해, 는 로 들어오는 방향으로 인접한 정점들의 집합, 즉 를 의미합니다.
최단 경로의 성질
최단 경로를 구하는 알고리즘을 알아보기 전에 최단 경로가 가지는 흥미로운 성질들을 먼저 공부해 보겠습니다. 아래 소개할 성질들은 나중에 보여드릴 알고리즘을 분석할 때 요긴하게 사용됩니다.
첫 번째 성질은 어떤 정점
정리 1. 최단 단순 경로
음의 순환이 없는 방향 그래프
[증명] 만약
이제 다음과 같은 경로
이 경로는
그러면 우리는 쉽게
아직 증명이 끝나지 않았습니다.

정리 1을 통해서 우리는 모든 경로에 대해서 생각할 필요 없이, 단순 경로 중에서 최단 경로가 되는 것만 따져 보면 된다는 것을 알 수 있습니다. 다만 여전히 임의의 두 정점 사이의 단순 경로도 매우 많기 때문에 단순 경로를 모두 순회할 수는 없습니다. 따라서 최단 경로를 효율적으로 구하기 위해서는 좀더 특별한 성질을 찾아야 합니다. 다음 정리를 통해 그것이 무엇인지 확인할 수 있습니다.
정리 2. 최단 경로들의 관계
임의의 방향 그래프
-
에서 마지막 를 제거한 은 에서 까지 향하는 최단 경로이다. 을 에서 로 향하는 과 다른 최단 경로라고 할 때, 에서 을 따라 에 도착한 다음 로 가는 경로 도 에서 까지 가는 최단 경로이다.
[증명] 첫 번째 명제는 귀류법으로 증명합니다.
두 번째 명제는
앞에서 배운 정리들을 토대로 우리는 다음과 같은 사실을 유추할 수 있습니다. 먼저 정리 2를 통해 알 수 있는 것은
정리 1에서 음의 순환이 없는 그래프 위에서는 단순한 최단 경로가 존재한다고 했습니다. 그러므로 그래프 위에
흥미로운 점은, 간단한 수학적 귀납법을 사용하면, 임의의 정점

점화식 세우기
이전 절에서 최단 경로 문제를 해결하기 위해서는 최단 경로 트리를 만드는 것이 중요하다고 하였습니다. 그러기 위해서는 각 정점
첫 번째로 자연스럽게 생각할 수 있는 점화식은 다음과 같습니다. 각 정점
점화식을 세웠으니 이를 따라 알고리즘을 짜면 되겠죠. 그런데 그게 과연 가능할까요? 안타깝지만 쉽지 않습니다. 왜냐하면 위 점화식은 입력으로 주어지는 그래프에 순환이 있으면 자기 참조(self-reference)에 빠지기 때문입니다.

예를 들어, 그림 5에서
이 상황을 컴퓨터과학적으로 해결하는 것은 매우 어렵습니다. 비록 정리 1을 통해 최단 경로에 순환이 없다는 사실을 알고 있어도, 직전 정점에 대한 정보가 전혀 없이는 어떤 방법으로 점화식을 풀어갈 수 있는지 알기 어렵습니다.[ㄱ] 과연 어떻게 이를 해결할 수 있을까요?
점화식을 잘 들여다 보면 힌트를 얻을 수 있습니다.
따라서 다음과 같이 경로의 길이가 추가된 점화식을 생각해 볼 수 있겠습니다. 각 정점
정리 3. 알고리즘으로 해결 가능한 점화식
다음 점화식이 성립한다.
[증명] 만약
마지막으로 가장 복잡한
정리 3의 점화식을 보면 자기 참조가 일어날 수 없는 구조라는 것을 쉽게 알 수 있습니다. 왜냐하면
정리 4. 점화식 1과 점화식 2의 관계
임의의
벨만-포드 알고리즘 (Bellman-Ford algorithm)
앞에서 우리는 점화식 2가 자기 참조도 없으면서
알고리즘 1. Bellman-Ford algorithm
입력: 음의 순환이 없는 방향 그래프
출력: 최단 경로 트리
- 2차원 배열
에 대해, ; 단, - 1차원 배열
에 대해, 에 대해:- 각 정점
에 대해:- 각 정점
에 대해, 만약 이면,
- 각 정점
- 각 정점
를 갖고 최단 경로 트리를 만든다.
이 알고리즘이 올바르게 동작한다는 것은 앞에서 모두 보였습니다. 따라서 남은 것은 이 알고리즘의 수행 시간을 계산하는 것입니다.
정리 5. 알고리즘 1의 수행 시간
알고리즘 1은
[증명] 단계 1은
이 알고리즘이 바로 벨만-포드 알고리즘(Bellman-Ford algorithm)입니다.
더 효율적인 구현
제 블로그에서 알고리즘의 공간 복잡도를 다룬 적은 잘 없었던 것 같습니다. 특별히 공간에 제약이 있는 경우가 아니라면 보통은 수행 시간에 관심이 많기 때문이죠. 또한, 이론적인 이득이 없는 이상에야 알고리즘을 어떻게 구현하는 것이 좋을지에 대해서도 비중 있게 다룬 적이 없었습니다. 하지만, 벨만-포드 알고리즘에서 만큼은 이 내용도 중요해 보여 짚고 넘어가고자 합니다.
알고리즘 1이 사용하는 공간은 얼마나 될까요?
놀랍게도 이보다 더 효율적으로 구현하는 방법이 있습니다.
알고리즘 2. Bellman-Ford algorithm (better implementation)
입력: 음의 순환이 없는 방향 그래프
출력: 최단 경로 트리
- 1차원 배열
에 대해, , ( ) - 1차원 배열
에 대해, 에 대해:- 각 간선
에 대해, 만약 이면,
- 각 간선
를 갖고 최단 경로 트리를 만든다.
이전 2차원 배열
정리 6. 알고리즘 2의 정당성(correctness)
알고리즘 1과 알고리즘 2를 동시에 돌린다고 가정하자. 임의의
[증명] 수학적 귀납법으로 보이겠습니다.
이제
정리 6을 통해 알고리즘 2가 최종적으로 유지하는
음의 순환이 있는 경우
위 알고리즘을 수행하기 위해서는 입력된 방향 그래프에 음의 순환이 없어야 한다는 조건이 있었습니다. 해당 조건은 왜 필요한 것일까요? 이는 정리 1의 증명을 잘 들여다 보면 답을 알 수 있습니다. 어떤 최단 경로에서 순환을 제거해도 무방했던 이유는 해당 순환의 비용이 음수가 아니었기 때문이었습니다. 그렇다면 음의 순환이 있으면 어떻게 될까요? 그 순환을 계속 반복하면 계속 비용이 적어지기만 할 것입니다. 따라서 비용이
정리 7. 음의 순환이 있는 경우
어떤 방향 그래프
음의 순환이 존재하면 알고리즘은 고사하고 문제 자체가 망가져 버린다는 것을 확인하였습니다. 그렇다면 음의 순환에 대처할 수 있는 방법은 없는 것일까요? 다행히도 입력 그래프에 음의 순환이 존재하는지 여부를 판단할 수 있습니다. 바로 알고리즘의 단계 3을 한 번 더 수행하는 것이죠. 만약 음의 순환이 있다면 알고리즘은 더 적은 비용의 경로가 있다고 판단할 것이며, 이는 정리 1에 위배가 되므로 음의 순환이 있다고 판단할 수 있습니다.
알고리즘 3. Bellman-Ford algorithm with negative cycle detection
입력:방향 그래프
출력: 최단 경로 트리 또는 음의 순환 존재 여부
- 1차원 배열
에 대해, , ( ) - 1차원 배열
에 대해, 에 대해:- 각 간선
에 대해, 만약 이면,
- 각 간선
- 어떤 간선
에 대해, 만약 이면, 음의 순환이 존재한다. 를 갖고 최단 경로 트리를 만든다.
마치며
오랜만에 글을 적었습니다. 그동안 저는 논문 작업을 하느라 좀 바빴습니다. 사실 지금 마무리 지을 단계는 아니었는데 예기치 못한 사태가 발생해서 어쩔 수 없이 일찍 마무리하게 되었습니다. 아쉽기는 하지만 유종의 미를 거둘 수 있었으면 합니다. 논문 작업을 할 때는 그걸 하느라 바빠서 블로그 관리를 하지 못했는데, 다 쓴 후에도 영 포스팅을 할 생각이 들지 않았습니다. 이것 저것 다루면 좋겠다는 주제는 머릿속에 있었는데 행동으로 옮기지는 못했습니다. 좀 지쳤나 봅니다.
그러다 다시 글을 작성하게된 계기는 좀 부끄러운 일이 생겨서입니다. 언젠가 너무 당당하게 벨만-포드 알고리즘의 수행 시간이
이번 일을 계기로 블로그 포스팅도 좀더 해 나갈까 합니다. 읽어주셔서 고맙습니다. :)
참조
[1] Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein: Introduction to Algorithms, 3rd Edition. MIT Press 2009.
각주
[ㄱ] 단, 입력 그래프에 순환이 없는 경우에는 자기 참조의 모순에 빠지지 않으므로 이 점화식을 사용해 알고리즘을 구현할 수 있습니다. 이는
[ㄴ] 동적 계획법(dynamic programming)에 대한 설명입니다.
'조합론적 최적화 > Shortest path' 카테고리의 다른 글
A* 알고리즘 (A* Search Algorithm) (4) | 2023.11.25 |
---|---|
다익스트라의 알고리즘 (Dijkstra's Algorithm) (0) | 2021.10.09 |