Теорема о максимальном потоке и минимальном разрезе — как её понять и доказать?
Постоянно слышу «max-flow = min-cut», но не понимаю, почему это так, и что вообще такое разрез. Можно строгое, но усваиваемое объяснение и набросок доказательства? Зачем это знание на олимпиаде?
2 ответа
Разрез $(S,T)$ — это разбиение вершин на две части так, что $s \in S$, $t \in T$. Пропускная способность разреза — это сумма пропускных способностей рёбер, идущих из $S$ в $T$ (обратные не считаем). Минимальный разрез — разрез наименьшей пропускной способности.
Теорема (Форд-Фалкерсон): величина максимального потока равна пропускной способности минимального разреза.
Набросок доказательства через три эквивалентных утверждения:
- $f$ максимален $\Rightarrow$ в остаточной сети нет пути $s\to t$. Если бы путь был, можно увеличить поток — противоречие.
- Нет пути $s\to t$ в остаточной сети $\Rightarrow$ существует разрез величины $|f|$. Возьмём $S$ = множество вершин, достижимых из $s$ в остаточной сети. Тогда $t\in T$. Все рёбра из $S$ в $T$ насыщены (иначе была бы остаточная пропускная и достижимость), а все рёбра из $T$ в $S$ несут нулевой поток. Значит поток через разрез = сумма пропускных рёбер $S\to T$ = пропускная этого разреза.
- Любой поток $\le$ любой разрез (слабая двойственность): поток через любой разрез равен $|f|$, и он $\le$ пропускной разреза.
Из (1)+(2): нашли разрез величины $|f|$. Из (3): $|f| \le$ min-cut. Значит этот разрез минимальный, а поток максимальный.
Зачем на олимпиаде: многие задачи на «минимальную стоимость разделить/разбить» сводятся к минимальному разрезу, который считается как максимальный поток. Project selection, image segmentation, минимальное вершинное покрытие в двудольном — всё это min-cut в маскировке.
Дополню геометрической интуицией. Поток ограничен любым «бутылочным горлышком»: какой бы разрез вы ни взяли, весь поток обязан через него пройти, поэтому $|f| \le c(S,T)$ для всех разрезов. Теорема говорит, что это ограничение достижимо — самое узкое горлышко (min-cut) и определяет максимум. Поэтому на практике, если нужно доказать оценку «поток не больше K», достаточно предъявить разрез величины K. Это частый приём в разборах: вместо запуска алгоритма доказывают оптимальность через явный разрез.