МатВектор

Command Palette

Search for a command to run...

🔀 Дискретка32 минСложность 4/5+70 XP

Потоки в сетях: алгоритм Форда-Фалкерсона и минимальный разрез

Как пропустить максимум через сеть труб, дорог или серверов: определение потока, дополняющие пути, теорема о максимальном потоке и минимальном разрезе.

3 интерактива3 квизаУрок 13 из 20Обновлено 01.06.2025Обычный

Из пункта А в пункт Б ведёт сеть дорог, у каждой — своя пропускная способность: сколько машин в час она выдерживает. Вопрос диспетчера звучит так: как организовать движение, чтобы через сеть проходило максимум транспорта, и где узкое место? Тот же вопрос стоит перед трубопроводами, дата-центрами и логистикой. На языке графов это задача о максимальном потоке — одна из самых красивых задач дискретной математики, с теоремой, которая находит узкое место быстрее, чем вы успеете сказать «Форда-Фалкерсона».

Сеть, поток, величина потока#

Сеть — ориентированный граф, в котором выделены две вершины: исток (откуда всё течёт) и сток (куда всё стекает), а каждое ребро несёт неотрицательное число — пропускную способность . Поток — это функция на рёбрах, подчинённая двум законам:

  • ограниченность: поток по ребру не превосходит его пропускную способность,
  • сохранение: в каждой промежуточной вершине сколько вошло, столько и вышло —

Величина потока — суммарное количество, выходящее из истока (по закону сохранения оно равно и сумме, входящей в сток). Задача о максимальном потоке: среди всех допустимых потоков найти тот, у которого величина наибольшая. Заметьте: «пропускать максимум» — не значит «залить всё по максимуму в каждую трубу». Пример ниже покажет, почему жадность по рёбрам ломает сохранение.

Рабочий пример на весь урок — сеть из четырёх вершин и пяти рёбер: с , с , с , с , с . Нарисуйте её на бумаге: из истока два выхода, в сток два входа, и одно боковое ребро . Верхняя граница очевидна: из выходит не больше . Сможем ли мы эти 15 реализовать — увидим.

Разрез: где сеть ломается#

Разделим вершины на две части: содержит исток, содержит сток. Разрезом называют набор рёбер, идущих из в , а его пропускной способностью — сумму по этим рёбрам. Смысл простой: разрежьте сеть на «источную» и «сточную» половины — весь поток обязан перебраться через разрез, поэтому

величина потока не превышает пропускной способности ни одного разреза

В нашей сети разрез имеет пропускную способность ; разрез — рёбра (5), (5) и (15), итого 25. Разрезы бывают узкими и широкими, и весь фокус в том, что искать нужно самый узкий. Теорема Форда-Фалкерсона — центральный результат всей темы: максимальный поток равен пропускной способности минимального разреза. Как только вы нашли поток и разрез с одинаковой величиной — оба оптимальны, доказывать больше нечего.

Множество $S$Рёбра через разрезПропускная способность
,
,
, ,
,
Все четыре разреза сети-примера: узких два, оба с потолком 15

Таблица подсказывает занятную деталь: минимальных разрезов здесь два — и , оба с потолком 15. Это не редкость: минимальный разрез не обязан быть единственным, зато его величина всегда одна — она и равна максимальному потоку. Практический смысл узкого места тоже читается прямо: чтобы пропустить через сеть больше пятнадцати, недостаточно перекачать больше машин — нужно физически расширять одно из горлышек, скажем ребро .

Алгоритм Форда-Фалкерсона: прокладываем маршруты#

Алгоритм действует по-диспетчерски: пока удаётся найти путь от к , по которому можно хоть что-то дополнительно протолкнуть, — проталкиваем. Такой маршрут называется дополняющим путём, а его пропускная способность — минимум по рёбрам пути (бутылочное горлышко). Хитрость, на которой держится вся корректность, — остаточная сеть: по каждому ребру мы помним, сколько осталось до предела (прямая резерв), и, главное, разрешаем отменять уже отправленный поток обратным ребром. Отмена — не бухгалтерская условность: именно она позволяет исправлять неудачные ранние решения.

Что здесь поучительно: рёбра с пропускной способностью 15 так и остались недогруженными — по ним прошло всего 5. Максимум упёрся не в боковое ребро, а в два «горлышка»: и пара вместе с . Интуиция «загрузить все трубы до отказа» в сетях не работает — работает баланс целого.

Зачем нужны обратные рёбра#

Покажем на контрпримере, без чего алгоритм разваливается. Возьмём сеть: (1), (1), (1), (1), (1). Максимум здесь равен 2: маршрут плюс маршрут . Но жадный путь занимает диагональ , и после него прямых маршрутов не остаётся: и , и заполнены. Без отмены алгоритм застрял бы на потоке 1 — вдвое меньше оптимума.

Обратное ребро спасает: в остаточной сети у занятого появляется возврат с остатком 1. Путь проходит по нему и «разворачивает» диагональ: единица потока по отменяется, вместо неё отправляются и . Итог — поток 2. Умение отменять решения и отличает правильный алгоритм от жадной ловушки; та же идея, кстати, нужна в задачах о паросочетаниях, куда потоки сводятся напрямую.

Скорость алгоритма и где это применяется#

Если пропускные способности целые, каждый дополняющий путь добавляет хотя бы единицу, и число итераций не больше величины потока: чистый Форд-Фалкерсон работает за , где — число рёбер. Для разумных это отлично, но сеть с пропускной способностью в миллионы заставит алгоритм сделать миллион почти одинаковых шагов. Лекарство — выбирать путь поиском в ширину: алгоритм Эдмондса-Карпа гарантирует не более итераций и итоговую сложность — уже без капризов входных данных. Поиск в ширину и в глубину на графах разобран в уроке об обходах.

Сводимость — вторая суперсила темы. Паросочетание «кандидаты — вакансии» превращается в сеть добавлением истока, стока и рёбер единичной пропускной способности: максимальный поток = максимальное число трудоустройств. Так же решаются задачи о перевозках с промежуточными складами, о разбиении изображений на объект и фон, о выборе проектов с общими ресурсами. И проверьте себя на симуляторе ниже: поиск увеличивающего пути — это обычный поиск пути в графе, просто с двумя ограничениями на направление.

Тема естественно вырастает из соседних глав курса: сети — это графы с весами в другой роли, а поиск дополняющих путей переиспользует обходы. Если хочется разминки с рёбрами и вершинами, зайдите в урок о деревьях или потренируйте пересчёты в тренажёре по комбинаторике.

Проверь себя+15 XP

В вершину a входит поток 7. Рёбра наружу: a→t несёт 3, a→b несёт 5. Допустимый ли это поток?

Проверь себя+15 XP

Пропускные способности рёбер из истока: 4 и 6. Что можно сказать о максимальном потоке?

Проверь себя+15 XP

Остаточные способности вдоль пути s→a→b→t: 5, 10 и 5. Сколько потока можно протолкнуть этим путём?

Частые вопросы

Всегда ли алгоритм Форда-Фалкерсона останавливается?

При целых (или хотя бы рациональных) пропускных способностях — да: каждая итерация добавляет хотя бы единицу, а поток ограничен. При иррациональных способностях возможен вечный цикл со сходящимся, но не достигающим оптимума потоком — классический предостерегающий пример. Практический иммунитет — Эдмондс-Карп с BFS-выбором пути.

Что такое остаточная сеть простыми словами?

Это карта того, что ещё можно изменить: по каждому ребру — запас до предела вперёд и возможность вернуть уже отправленный поток назад. Дополняющий путь ищется именно по этой карте, а не по исходной сети, поэтому алгоритм умеет исправлять свои прошлые решения.

Как после остановки алгоритма найти минимальный разрез?

Обойдите остаточную сеть из истока и соберите все достижимые вершины в множество S. Рёбра из S в недостижимые вершины образуют минимальный разрез, и его пропускная способность равна найденному максимальному потоку — это содержимое теоремы Форда-Фалкерсона в одну строчку.

Где в реальной жизни применяются потоки?

Логистика и трубопроводы, распределение трафика в сетях связи, паросочетания при распределении задач и абитуриентов, сегментация изображений, составление расписаний. Везде, где есть ресурсы с ограниченной пропускной способностью и вопрос «сколько максимум можно провести».

Готовитесь к контрольной?

Чеклист тем по «Дискретка»: что вы уже умеете, что повторить и в каком порядке.

Открыть чеклист предмета →

Проверьте себя в бою

Босс-экзамен по «Дискретка»: квизы всех уроков плюс бесконечный поток сгенерированных задач. Каждая попытка — новый расклад.

Начать босс-экзамен →