최대 유량 문제
용량이 정해진 방향 간선들로 이뤄진 네트워크에서, 소스 \(s\) 에서 싱크 \(t\)
로 흘려보낼 수 있는 흐름의 최댓값을 구하는 문제다. 각 간선 \((u, v)\)에 용량
\(c(u, v)\)가 있고, 흐름 \(f\)는 다음을 만족해야 한다.
- 용량 제약: \(0 \le f(u, v) \le c(u, v)\).
- 흐름 보존: \(s, t\)를 뺀 모든 정점에서 들어온 흐름 = 나간 흐름.
목표는 \(s\)에서 나가는 총 흐름 \(|f|\)를 최대화하는 것이다.
잔여 그래프와 증가 경로
핵심 도구는 잔여 그래프(residual graph) 다. 간선 \((u, v)\)에 현재 \(f\)만큼
흘렸다면, 그 간선의 남은 용량은 \(c - f\)이고, 동시에 역방향 간선 \((v, u)\)에
\(f\)만큼의 잔여 용량이 생긴다. 역방향 용량은 "이미 보낸 흐름을 되돌릴 수
있다"는 뜻이며, 이것이 알고리즘이 잘못 보낸 흐름을 재배치하게 해 준다.
잔여 그래프에서 \(s \to t\)로 잔여 용량이 모두 양수인 경로를 증가 경로
(augmenting path) 라 한다. 경로상의 최소 잔여 용량만큼 흘리면 총 유량이
늘어난다. 증가 경로가 없을 때까지 반복하는 것이 포드-풀커슨 방법이다.
최대 유량 최소 컷 정리
컷이란 정점을 \(s\) 쪽 집합 \(S\)와 \(t\) 쪽 집합 \(T\)로 나누는 것이고, 그 용량은
\(S \to T\)로 가는 간선들의 용량 합이다.
정리: 최대 유량의 값 = 최소 컷의 용량.
증명의 골자는 (1) 어떤 흐름도 어떤 컷의 용량을 넘을 수 없고(약한 쌍대성),
(2) 증가 경로가 더 없을 때 \(s\)에서 잔여 그래프로 도달 가능한 정점 집합 \(S\)가
용량과 흐름이 정확히 일치하는 컷을 이룬다는 것이다. 이 정리 덕분에 "최대로
보낼 수 있는 양"과 "최소 비용으로 끊는 법"이 같은 값이 된다.
정당성과 종료
증가 경로가 없으면 위 컷 논증으로 현재 흐름이 최대임이 보장된다. 정수 용량이면
매 증가가 유량을 최소 1씩 늘리므로 유한 번에 끝난다. 다만 경로 선택을 아무렇게나
하면 느릴 수 있어, BFS로 최단 증가 경로를 고르는 에드몬드-카프(\(O(VE^2)\)),
나아가 레벨 그래프와 blocking flow를 쓰는 디닉(\(O(V^2\ E)\))으로 가속한다.
무엇을 모델링할 수 있나
이분 매칭, 정점/간선 분리 제약, 프로젝트 선택(최대 가중 닫힌 집합), 이미지
분할 등 수많은 최적화 문제가 최대 유량/최소 컷으로 환원된다. 모델링 능력이
이 주제의 진짜 핵심이다.