Почему жадный алгоритм без обратных рёбер не находит максимальный поток? Контрпример
Не понимаю, зачем нужны обратные рёбра в потоке. Казалось бы: ищем любой путь от истока к стоку, пускаем по нему максимум, повторяем. Почему так нельзя? Можно конкретный маленький контрпример, где это даёт не оптимум?
2 ответа
Классический контрпример на 4 вершинах. Вершины . Рёбра (все пропускной способности 1, кроме среднего):
s -> a : 1
s -> b : 1
a -> t : 1
b -> t : 1
a -> b : 1 (это «диагональ»)
Максимальный поток здесь равен 2: пускаем и .
Но жадность может сначала выбрать «неудачный» путь (величина 1). После этого рёбра , , насыщены. Остаётся только и , но между ними нет пути ( ведёт только в через насыщенное ребро, а в зайти неоткуда). Жадность останавливается на потоке 1 — это не оптимум.
Обратные рёбра спасают: после пуска в остаточной сети есть обратное ребро (пропускная 1). Теперь находится путь , использующий это обратное ребро. Пуск по нему «откатывает» поток на и перенаправляет его правильно. Итог — поток 2. Обратное ребро формально означает «я передумал гнать поток через эту диагональ».
Именно поэтому корректные алгоритмы (Форд-Фалкерсон и потомки) всегда работают в остаточной сети, а не в исходной.
Полезная интуиция: обратное ребро — это не «физический» канал, а право отмены уже принятого решения. Без возможности откатить раннюю ошибку жадный выбор пути может загнать в локальный оптимум. Теорема Форда-Фалкерсона гарантирует: если в остаточной сети нет ни одного увеличивающего пути, то поток максимален (и тогда же находится минимальный разрез). Без обратных рёбер вы проверяете отсутствие путей в неправильном графе, поэтому и получаете неправильный ответ.