문제 정의
각 간선에 용량뿐 아니라 단위 흐름당 비용이 붙어 있다. 소스에서 싱크로
보내는 흐름을 최대화하되, 그 최대 유량을 달성하는 방법 중 총비용을
최소화하는 것이 최소 비용 최대 유량(MCMF) 이다. 총비용은
\(\sum_{(u,v)} f(u,v) \cdot \text{cost}(u,v)\)로 정의된다.
핵심: 최소 비용 증가 경로
최대 유량을 증가 경로로 늘리던 것을 그대로 따르되, 매번 잔여 그래프에서
\(s \to t\)로 가는 최단(최소 비용) 경로를 골라 흐름을 보낸다.
정리: 항상 최소 비용 증가 경로로 흘리면, 각 유량 값에서 비용이 최소인
흐름을 유지한다. 따라서 더 이상 증가 경로가 없을 때(=최대 유량) 비용도
최소다.
직관은 다음과 같다. 현재 흐름이 그 유량에서 최소 비용이라고 가정하면, 잔여
그래프에는 음수 비용 사이클이 없다(있다면 그걸 따라 비용을 더 줄일 수 있어
가정에 모순). 음수 사이클이 없으면 최단 경로가 잘 정의되고, 그 경로로 흘린
새 흐름도 다음 유량 값에서 최소 비용이 됨이 귀납적으로 보장된다.
역간선과 음수 비용
플로우처럼 잔여 그래프에 역간선을 둔다. 정방향 간선의 비용이 \(w\)이면,
역간선의 비용은 \(-w\)다(흐름을 되돌리면 비용도 환불). 이 음수 비용 때문에
단순 다익스트라를 바로 쓸 수 없고, SPFA(벨만-포드 큐 최적화) 로 최단 경로를
찾는 것이 가장 흔한 구현이다.
복잡도
최소 비용 경로를 한 번 찾는 SPFA가 \(O(VE)\)이고, 증가 횟수가 최대 유량 값 \(F\)나
\(O(VE)\)에 비례할 수 있어 일반적으로 \(O(F \cdot VE)\) 수준이다. 음수 간선을
존슨식 퍼텐셜로 보정하면 매 반복을 다익스트라(\(O(E \log V)\))로 바꿔
\(O(F \cdot E \log V)\)로 줄일 수 있다.
무엇을 모델링하나
"최대한 많이 짝지으면서 비용 최소", "정해진 개수만큼 보내되 비용 최소"(소스
용량을 \(k\)로 제한), 작업 배정의 가중치판인 할당 문제 등이 MCMF로 환원된다.
가중 이분 매칭은 MCMF의 대표적 특수 사례다.