지금까지 저는 제 블로그에서 최대 흐름 문제(maximum flow problem)를 많은 포스트를 통해서 다루어 왔습니다. 가장 최근에는 최대 흐름 문제를 다항 시간에 해결하는 에드몬즈-카프 알고리즘(Edmonds-Karp algorithm)을 소개해 드렸죠. 이번에는 에드몬즈-카프 알고리즘보다 더 빠른 시간에 최대 흐름 문제를 해결하는 방법 중 하나를 소개하고자 합니다. 바로 우리에게는 디닉의 알고리즘(Dinic's algorithm)으로 더 잘 알려진, 디니츠의 알고리즘(Dinitz' algorithm)입니다.
포탈에 검색해 봤더니 디니츠의 알고리즘을 어떻게 구현하는지 우리말로 설명한 게시글은 적잖이 볼 수 있었습니다. 다만 어째서 디니츠의 알고리즘이 에드몬즈-카프 알고리즘보다 효율적으로 동작하는지에 대한 설명은 찾기 어렵더군요. 제가 블로그를 운영하는 가장 큰 이유 중 하나가 바로 이러한 간극을 메우는 것이다 보니, 디니츠의 알고리즘은 언젠가 한번은 꼭 다루어야겠다고 다짐했었습니다. 이번에 이를 정리하게 되어 기쁩니다.
일화(逸話)

당시 소련의 학생이던 예핌 디니츠(Yefim Dinitz)는 아델슨-벨스키(George Adel'son-Vel'sky)의 알고리즘 수업을 듣고 있었습니다. AVL 트리의 개발자로 유명한 아델슨-벨스키는 매 수업마다 다음 수업 시간에 배울 주제에 대해 학생들이 한번 생각해 보도록 문제가 무엇인지만 달랑 던져 주었다고 합니다. 언젠가 최대 흐름 문제가 소개되자 포드-풀커슨 방법(Ford-Fulkerson method)을 몰랐던 디니츠는 잘못된 알고리즘을 하나 떠올리게 됩니다. 하지만 놀랍게도 그 잘못된 알고리즘을 조금 수정하면 (비록 약간의 시간 손실은 있을지언정) 효율적으로 최대 흐름 문제를 해결하는 알고리즘을 얻을 수 있었다고 합니다. 그렇게 얻은 결과가 바로 이번에 소개할 디니츠의 알고리즘입니다.
이 알고리즘이 개발된 때에는 미국과 소련의 냉전이 한창이었습니다. 따라서 디니츠의 알고리즘이 서구권에는 디니츠의 이름으로 곧바로 소개되지 않았죠. 이스라엘의 컴퓨터과학자 시몬 이븐(Shimon Even)과 (당시 박사 학생이던) 알론 이타이(Alon Itai)는 디니츠의 알고리즘을 알게 되고, 삼일 밤낮을 투자한 끝에 이 알고리즘을 이해한 후 서구권에 이를 소개하게 됩니다. 이때, 디니츠의 이름을 "디닉(Dinic)"으로 잘못 옮겨 적으면서, 우리에게는 디니츠의 알고리즘보다 디닉의 알고리즘이라고 더 잘 알려지게 된 것이라고 합니다.
저도 처음에는 이 알고리즘을 지칭할 때 더 잘 알려진 "디닉의 알고리즘"으로 하려고 했습니다만, 아무래도 디니츠의 이름을 밝히는 것이 옳은 것 같아서 "디니츠의 알고리즘"으로 통일하였습니다.
문제 및 기본 개념 소개
최대 흐름 문제가 무엇이고 관련된 개념에 어떤 것들이 있었는지를 가볍게 짚고 넘어가겠습니다. 이 문제는 어떤 흐름 네트워크(flow network)
- 모든 용량은 음이 아닌 정수의 값을 갖는다.
- 루프(loop), 평행 간선(parallel edge), 역평행 간선(anti-parallel edge)이 존재하지 않는다.
이다.
최대 흐름 문제를 해결하는 가장 기본적인 방법은 어떤 흐름
혹여 위 내용이 익숙하지 않으신 분들은 이전 포스트를 참조하시기 바랍니다.
에드몬즈-카프 알고리즘 복습
안타깝게도 포드-풀커슨 방법은 증가 경로를 "멍청하게" 선택하면 최악의 경우 지수 시간(exponential time)에 동작하였습니다. 따라서 "똑똑하게" 증가 경로를 선택하는 방법이 필요했죠. 에드몬즈-카프 알고리즘에서는 다음과 같이 가장 간선의 개수가 적은 증가 경로, 다시 말해 최단 증가 경로를 선택했습니다.
알고리즘 1. Edmonds-Karp algorithm
입력: 흐름 네트워크
출력: 최대 흐름
에서 에서 에 도달할 수 없을 때까지 아래를 반복한다. 에서 에서 로 가는 경로 중 간선의 개수가 가장 적은 경로 하나를 라고 하자.
를 반환한다.
이전 포스트에서 우리는 에드몬즈-카프 알고리즘이
사실, 위 성질은 더 일반적인 경우에도 성립합니다. 어떤 흐름
정리 1. 시종점으로부터 멀어지기만 하는 성질
어떤 흐름
이미 이전 포스트에서
디니츠의 알고리즘 개략적 구조
곧바로 디니츠의 알고리즘이 무엇인지 알려 드리기에 앞서, 개략적인 구조가 어떻게 생겼는지를 따져보면서 어떤 아이디어를 갖고 이 알고리즘이 만들어졌는지를 생각해 보겠습니다. 잠시 에드몬즈-카프 알고리즘으로 다시 돌아와 봅시다. 과연 에드몬즈-카프 알고리즘의 어떤 부분을 우리가 발전시킬 수 있을까요? 정리 1을 통해 우리가 유추할 수 있는 사실은 에드몬즈-카프 알고리즘이 단계 2-a에서 찾는 증가 경로
만약 여기서 우리가 같은 길이를 갖는 최단 증가 경로를 "한번에" 찾는 서브루틴(subroutine)이 있다면 어떻게 될까요? 최단 증가 경로의 길이는 분명
아래에서 우리는 최단 증가 경로를 "한번에" 찾기 위해서 아래를 만족하는 "특별한" 자료 구조를 하나 만들 것입니다.
- 이 자료 구조는 매번 유지하는 흐름에 대한 잔여 네트워크 위의 현재 고려하는 길이의 최단 증가 경로를 계속 포함한다.
- 만약 이 자료 구조 위에서
에서 까지 도달할 수 없으면 현재 고려하는 길이의 최단 증가 경로는 존재하지 않는다.
따라서 이 자료 구조에서 계속 최단 증가 경로를 찾아 흐름을 증가시켜 주면 같은 길이의 최단 증가 경로를 한번에 찾을 수 있게 되는 것이죠. 이를 개략적으로 표현하면 아래와 같습니다.
알고리즘 2. Dinitz' algorithm (sketch)
입력: 흐름 네트워크
출력: 최대 흐름
에서 에서 에 도달할 수 없을 때까지 아래를 반복한다.- 같은 길이의 최단 증가 경로를 한번에 찾을 특별한 자료 구조를 만든다.
- 특별한 자료 구조에서
에서 에 도달할 수 없을 때까지 아래를 반복한다.- 특별한 자료 구조에서
에서 로 가는 최단 증가 경로 를 찾는다. - 특별한 자료 구조를 현재의
에 맞게 갱신한다.
- 특별한 자료 구조에서
를 반환한다.
레이어드 네트워크(Layered Network)

이제 특별한 자료 구조를 만나 볼 차례입니다. 앞에서 우리는 이 자료 구조가 매번 현재 유지하는 흐름에 대한 고려하는 길이의 최단 증가 경로를 계속 포함하기를 바랐습니다. 이를 위해서 우리는 어떤 흐름에 대해, 잔여 네트워크 위
좀더 자세히 정의하겠습니다. 어떤 흐름
따라서,
각

여기까지 오셨으면, 우리가 찾을 것이 무엇인지 감이 잡히셨을 것입니다. 어떤 흐름
알고리즘 3. Layered network construction
입력: 흐름
출력: 레이어드 네트워크
위에서 정방향으로 에서 BFS를 를 찾을 때까지 수행한다.- 이전 단계에서 방문한 정점들과 간선들만 가지고 역방향으로
에서 BFS를 수행한다.
알고리즘 3이 실제로 레이어드 네트워크를 만든다는 증명은 생략하도록 하겠습니다.
레이어드 네트워크 갱신하기
이전 절에서는 어떤 흐름
어떤 흐름
과연
정리 2. 갱신된 레이어드 네트워크의 성질
어떤 흐름
[증명] 우선
경우 1:
경우 2:
정리 2는 우리에게 도움이 되는 유용한 성질들을 많이 내포하고 있습니다. 특히 다음과 같은 상황을 생각해 봅시다. 어떤 흐름
첫 번째로 알 수 있는 사실은
마지막으로 각
레이어드 네트워크에서 최단 증가 경로 찾기
지금까지 레이어드 네트워크는 어떤 흐름의 잔여 네트워크 위
- 알고리즘 2의 단계 2-a에서 레이어드 네트워크를 하나 만듭니다. 이는 두 번의 BFS면 충분하므로
에 수행할 수 있습니다. - 다음 단계 2-b를 수행합니다. 앞에서 우리는 그 횟수가
가 된다는 것을 확인하였습니다. 레이어드 네트워크가 갱신될 때마다 적어도 하나의 간선은 병목 간선이 되어 사라지기 때문이었습니다. - 먼저 단계 2-b-ii와 2-b-iii을 생각해 봅시다. 만약 최단 증가 경로
를 찾았다면, 그 경로를 따라서 갱신해 주면 됐습니다. 그 길이는 이므로 수행 시간도 그에 비례하여 걸릴 것입니다.
따라서 만약 우리가 단계 2-b-i을
문제는 갱신한 후에도 가능한지입니다. 정리 2에 따르면 증가한 다음의 흐름
안타깝지만

그렇다면 방법이 없을까요? 앞에서 분석했던 내용을 다시 곰곰이 생각해 봅시다. 갱신된 네트워크에서
아니요, 없습니다! 레이어드 네트워크의 모든 간선은 이전 층에서 다음 층으로 가는 방향 뿐입니다. 게다가 앞에서 확인했듯이 레이어드 네트워크는 갱신이 될 때마다 간선이 사라지기만 할 뿐입니다. 그러므로 어느 정점이 "막다른 길"로 판단이 된 후에는 과감히 그 정점과, 그 정점으로 들어오는 간선을 무시해 주면 됩니다.
알고리즘 4. Finding an augmenting path in a layered network
입력: (갱신된) 레이어드 네트워크
출력: 증가 경로 혹은
를 기점으로 다음을 고려하며 DFS를 수행한다.- 만약 어떤 정점를 방문했을 때, 다음 층으로 가는 간선이 존재하지 않으면 해당 정점과 해당 정점으로 들어오는 간선을
에서 지운다. - 만약
에 도달하면, 방문한 경로를 출력한다. - 도달하지 못하면(즉, 네트워크의 모든 개체가 지워졌으면)
에서 로 도달할 수 없다고 판별한다.
- 만약 어떤 정점를 방문했을 때, 다음 층으로 가는 간선이 존재하지 않으면 해당 정점과 해당 정점으로 들어오는 간선을
이제 수행 시간을 분석해 봅시다. 사실 알고리즘 4가 한 번 수행될 때 걸리는 시간은 여전히
정리 3. 최단 증가 경로를 한번에 찾을 때의 총 수행 시간
어떤 흐름을 시작으로 레이어드 네트워크를 만든 후, 레이어드 네트워크에서
[증명] 앞에서 레이어드 네트워크를 만드는 작업, 최단 증가 경로를 따라 흐름을 증가시키는 작업, 레이어드 네트워크를 갱신하는 작업은 각각
이제 알고리즘 4를 수행하는데 필요한 총 시간을 계산해 보겠습니다. 알고리즘 4가
- 이번 수행 동안 막다른 정점으로 밝혀져 지워진 정점들
- 그렇지 않은 정점들
여기서 우리는 이 정점 나열에서 막다른 정점으로 판정되지 않은 정점들의 개수가 정확히 층의 개수와 같아진다는 것을 알 수 있습니다. 반면 이번에 막다른 정점으로 판명된 정점들은 이후 다시는 방문되지 않습니다. 따라서 총 수행 시간도 다음의 두 부류에 맞추어 생각해 보겠습니다.
- 어떤 정점이 막다른 정점으로 밝혀지면 다음에는 전혀 호출되지 않으므로 이에 해당된 정점과 그 정점으로 들어오는 간선을 지우는데 들어가는 총 소요 시간은
가 됩니다. - 그외의 정점들이 실제 최단 경로를 찾는데 소모한 시간으로 볼 수 있고, 그 길이가
이므로 총 의 시간을 쓰게 됩니다.
따라서
지금까지 정리한 내용을 종합해 디니츠의 알고리즘을 기술해 보겠습니다.
알고리즘 5. Dinitz' algorithm
입력: 흐름 네트워크
출력: 최대 흐름
에서 에서 에 도달할 수 없을 때까지 아래를 반복한다.- 알고리즘 3을 사용하여 레이어드 네트워크
을 만든다. 에서 에서 에 도달할 수 없을 때까지 아래를 반복한다. 에서 알고리즘 4를 통해 에서 로 가는 최단 증가 경로 를 찾는다. 을 갱신한다.
- 알고리즘 3을 사용하여 레이어드 네트워크
를 반환한다.
마치며
이것으로 디니츠의 알고리즘에 대한 정리를 모두 마치겠습니다. 같은 길이의 최단 증가 경로를 한번에 찾아서 적용하는 이 알고리즘은 최대 흐름 문제 및 관련된 분야에 적잖은 파장을 주었습니다. 개인적으로 그중 가장 유명하다고 생각하는 성과는 바로 호프크로프트-카프 알고리즘(Hopcroft-Karp algorithm)입니다. 이는 최대 이분 매칭(maximum bipartite matching)을
2020/02/22 - [조합론적 최적화/Matching] - 호프크로프트-카프 알고리즘 (Hopcroft-Karp Algorithm)
호프크로프트-카프 알고리즘 (Hopcroft-Karp Algorithm)
엄청 오랜만에 포스팅을 합니다. 방학이 되면 시간이 나서 글을 좀 쓸 수 있을 줄 알았는데, 대학원생은 방학도 바쁘군요. 다행히 어느정도 일단락이 나서 이렇게 글을 쓸 수 있게 되었습니다.
gazelle-and-cs.tistory.com
어김 없이, 컴퓨터과학의 숙명과도 같은 문제를 가지고 오겠습니다. 과연 더 잘 할 수 있을까요? 놀랍게도 가능합니다. 다만 그 방법들은 매번 잔여 네트워크에서 증가 경로를 찾아 흐름을 증가시키는 포드-풀커슨 방법 기반이 아닙니다. 기회가 되면 이에 대해서 정리하는 시간을 갖도록 하겠습니다.
궁금하신 점이 있으시거나, 글의 내용에 잘못된 부분이 있으면 알려 주시기 바랍니다. 고맙습니다.
참조
[1] Yefim Dinitz. "Dinitz’algorithm: The original version and Even’s version." In Theoretical computer science, pp. 218-240. Springer, Berlin, Heidelberg, 2006.
'조합론적 최적화 > Flow & Circulation' 카테고리의 다른 글
서큘레이션 (Circulation) (3) | 2023.12.23 |
---|---|
에드몬즈-카프 알고리즘 (Edmonds-Karp Algorithm) (6) | 2021.02.21 |
포드-풀커슨 방법 (Ford-Fulkerson Method) (3) | 2020.08.30 |
최대 흐름 최소 절단 정리 (Max-Flow Min-Cut Theorem) (13) | 2020.08.29 |
최대 흐름 문제 이해하기 (Maximum Flow Problem) (20) | 2020.08.29 |