
최대 흐름 문제(maximum flow problem)는 어떤 흐름 네트워크(flow network)가 주어졌을 때 시점(source)에서 종점(sink)까지 최대로 많은 양의 흐름을 찾는 문제입니다. 이때 흐름은 각 간선에서 용량(capacity)을 넘을 수 없고, 시점과 종점을 제외한 나머지 정점에서는 들어오는 양과 나가는 양이 동일해야 하죠.
지난 포스트에서는 이 문제를 풀기 위하여 잔여 네트워크(residual network)와 증가 경로(augmenting path)가 무엇인지에 대해서 살펴보았으며, 최종적으로는 매번 현재 흐름으로 정의되는 잔여 네트워크 위에서 시점에서 종점으로 향하는 임의의 증가 경로를 찾아 현재 흐름을 증가시켜 주면 (모든 간선의 용량이 유리수일 때) 언젠간 최대 흐름을 찾게 된다는 것을 증명하였습니다. 이를 포드-풀커슨 방법(Ford-Fulkerson method)라고 불렀습니다.
포드-풀커슨 방법의 가장 큰 문제점은 효율적으로 동작한다는 보장을 하지 못한다는 것이었습니다. 이는 분석이 허술했던 게 아니었습니다. 증가 경로를 "멍청하게" 선택하면 포드-풀커슨 방법이 실제로 지수 시간(exponential time)에 동작하는 경우가 존재했습니다. 따라서 우리에게는 다음과 같은 의문이 자연스럽게 따라오게 됩니다.
만약 증가 경로를 "똑똑하게" 선택한다면 포드-풀커슨 방법이 효율적으로 동작할 수 있을까?
흥미롭게도 가능합니다. 매번 잔여 네트워크 위에서 시점에서 종점으로 가는 최단 경로(shortest path)를 하나 찾아 적용한다면, 이러한 포드-풀커슨 방법은 효율적으로, 즉 다항 시간(polynomial time)에 동작한다는 것을 보일 수 있습니다. 이 알고리즘이 바로 에드몬즈-카프 알고리즘(Edmonds-Karp algorithm)입니다.
이번 포스트에서는 에드몬즈-카프 알고리즘이 무엇인지 알아보고, 어째서 효율적으로 동작하는지에 대해서도 살펴보겠습니다. 이 글은 흐름 네트워크, 잔여 네트워크, 증가 경로, 포드-풀커슨 방법 등 최대 흐름 문제를 이해하는 데 필요한 기본적인 개념들을 잘 알고 있다는 가정 하에 작성되었습니다. 이에 대한 내용은 이전 포스트에서 소개하였으니 익숙하지 않으시면 이를 참조하시기 바랍니다.
포드-풀커슨 방법과 에드몬즈-카프 알고리즘
지난 포스트에서 다루었던 포드-풀커슨 방법을 다시 적어 보겠습니다. 사용된 기호는 모두 아래 포스트와 동일함을 알려 드립니다.
2020/08/30 - [조합론적 최적화/Flow & Circulation] - 포드-풀커슨 방법 (Ford-Fulkerson Method)
포드-풀커슨 방법 (Ford-Fulkerson Method)
최대 흐름 문제(maximum flow problem)는 어떤 흐름 네트워크(flow network)가 주어졌을 때, 시점에서 종점으로 흐르는 최대 흐름을 찾는 문제입니다. 지난 두 포스트를 통해 우리는 이 문제에서 최대 흐름
gazelle-and-cs.tistory.com
Ford-Fulkerson method
입력: 흐름 네트워크
출력: 최대 흐름
에서 에서 에 도달할 수 없을 때까지 아래를 반복한다. 에서 에서 로 가는 어떤 단순 경로를 라고 하자.
를 반환한다.
이 방법은
Edmonds-Karp algorithm
입력: 흐름 네트워크
출력: 최대 흐름
에서 에서 에 도달할 수 없을 때까지 아래를 반복한다. 에서 에서 로 가는 경로 중 간선의 개수가 가장 적은 경로 하나를 라고 하자.
를 반환한다.
이 알고리즘은 포드-풀커슨 방법의 한 가지 구현(implementation)에 해당합니다. 이전 포스트에서 우리는 용량이 모두 정수로 주어진다면 포드-풀커슨 방법이 최종적으로 최대 정수 흐름(maximum integral flow)을 반환한다는 것을 살펴보았습니다. 따라서 에드몬즈-카프 알고리즘도 최대 정수 흐름을 반환한다는 것을 알 수 있습니다. 이제 남은 것은 이 알고리즘이 다항 시간에 동작한다는 것을 보이는 것입니다.
다항 시간 알고리즘 증명
증명은 생각보다 어렵지는 않습니다. 이를 위해서는 각 정점이 잔여 네트워크 위에서 종점
정리 1. 잔여 네트워크 위에서의 거리의 증가성
언젠가 에드몬즈-카프 알고리즘이
[증명] 증가시킨 후의 흐름
따라서
마지막으로 남은 경우는
이 정리를 어떻게 활용해야 알고리즘이 다항 시간에 동작한다는 것을 보일 수 있을까요? 만약 매번 증가 경로를 적용시킬 때마다

따라서 이 방향으로는 분석할 수 없고, 다른 방법을 강구해야 합니다. 여기서 우리의 시야를 정점에서 간선으로 돌려 보겠습니다. 언젠가 알고리즘이 찾은 증가 경로
정리 2. 증가 경로를 찾는 횟수의 상한
에드몬즈-카프 알고리즘이 동작하면서 잔여 네트워크에 등장할 수 있는 임의의 간선
[증명] 언젠가 알고리즘이 흐름
알고리즘이
이를 통해 우리는
에드몬즈-카프 알고리즘이 계속 수행되면서 잔여 네트워크에 등장할 수 있는 간선은 원래 네트워크의 간선의 전진 간선(forward edge)이나 후진 간선(backward edge) 뿐이며, 따라서 그 수는
앞에서 최단 경로는 BFS를 사용하여 얻을 수 있다고 말씀 드렸습니다. 따라서 단계 2가 한 번 수행되는 데 필요한 시간은
마치며
여기까지 포드-풀커슨 방법의 다항 시간 구현 방법 중 하나인 에드몬즈-카프 알고리즘을 모두 살펴보았습니다. 포드-풀커슨 방법에서 단 하나, 어떤 증가 경로를 찾을지에 대해 특정한 것으로 지수 시간 알고리즘을 다항 시간 알고리즘으로 발전시킬 수 있었죠. 참으로 흥미로운 발견이 아닐 수 없습니다.
그럼에도 컴퓨터 과학의 숙명과도 같은 질문은 여전히 이어집니다. 과연 에드몬즈-카프 알고리즘을 발전시켜서 더 잘할 수 있을까요? 이는 최대 흐름 문제와 깊은 연관성이 있는 최대 이분 매칭 문제(maximum bipartite matching problem)에서 실마리를 찾을 수 있습니다. 최대 이분 매칭 문제를 해결하는 가장 간단한 방법은 매번 현재 매칭에 대한 증가 경로(augmenting path)를 하나 찾아서 적용하는 것입니다. 이때, 매번 가능한 짧은 증가 경로를 적용하면 흥미로운 성질을 하나 발견할 수 있는데, 바로 같은 길이의 증가 경로들이 서로 정점을 공유하지 않는다는 것입니다. 따라서 같은 길이의 증가 경로를 한번에 찾는다면 수행 시간을 단축시킬 수 있을 것입니다. 이 아이디어를 통해 얻은 방법이 바로 호프크로프트-카프 알고리즘(Hopcroft-Karp algorithm)입니다.
2020/02/22 - [조합론적 최적화/Matching] - 호프크로프트-카프 알고리즘 (Hopcroft-Karp Algorithm)
호프크로프트-카프 알고리즘 (Hopcroft-Karp Algorithm)
엄청 오랜만에 포스팅을 합니다. 방학이 되면 시간이 나서 글을 좀 쓸 수 있을 줄 알았는데, 대학원생은 방학도 바쁘군요. 다행히 어느정도 일단락이 나서 이렇게 글을 쓸 수 있게 되었습니다.
gazelle-and-cs.tistory.com
과연 비슷한 방법을 통해 에드몬즈-카프 알고리즘을 발전시킬 수 있을까요? 네, 그렇습니다. 그리고 그 알고리즘이 바로 디니츠의 알고리즘(Dinitz' algorithm)입니다. 우리에게는 디닉의 알고리즘(Dinic's algorithm)으로 더 잘 알려져 있죠. 다음 시간에는 이 알고리즘에 대해서 좀더 자세히 알아보도록 하겠습니다.
궁금한 점이 있으시거나, 내용에 오류가 있는 경우에는 알려 주시기 바랍니다. 고맙습니다. :)
참조
[1] Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein: Introduction to Algorithms, 3rd Edition. MIT Press 2009.
'조합론적 최적화 > Flow & Circulation' 카테고리의 다른 글
서큘레이션 (Circulation) (3) | 2023.12.23 |
---|---|
디니츠의 알고리즘 (Dinitz' Algorithm) (6) | 2021.02.27 |
포드-풀커슨 방법 (Ford-Fulkerson Method) (3) | 2020.08.30 |
최대 흐름 최소 절단 정리 (Max-Flow Min-Cut Theorem) (13) | 2020.08.29 |
최대 흐름 문제 이해하기 (Maximum Flow Problem) (20) | 2020.08.29 |