Публикация Школы траблшутеров

Особенности и принципы работы алгоритма Диница

Время чтения: 6 мин 30 сек
14 сентября 2026 г. Просмотров: 4

Алгоритм Диница разбирает сеть слоями и собирает максимальный поток 32 единицы на графе из четырнадцати вершин за три прохода. В 1970 году советский информатик Ефим Диниц дополнил метод Форда–Фалкерсона поиском в ширину: внутри слоя кратчайшие пути равны по числу рёбер, поэтому циклы не мешают. Основатель «Школы траблшутеров» Олег Брагинский и ученик Владислав Иванов показывают поуровневый счёт пропускной способности.

Особенности и принципы работы алгоритма Диница

Что добавил Диниц?

Ефим Диниц дополнил алгоритм Форда–Фалкерсона двумя идеями: поиском в ширину (breadth-first search) и слоями графа. Слои избавляют от циклов, держат пути равными по числу рёбер и фиксируют блокирующие потоки.

Блокирующий поток – течение, которое полностью заполняет одно из рёбер кратчайшего пути между истоком и стоком. Насытив ребро, алгоритм закрывает направление и ищет следующее.

Слой – набор кратчайших путей, равных по числу рёбер от истока. Пути длиннее ждут следующей итерации и внутри текущего слоя не работают.

Как устроен расчёт?

  1. Обнулить поток и разметить вершины по уровням: уровень равен длине кратчайшего пути от истока в рёбрах, у самого истока он нулевой.
  2. Оставить только рёбра, ведущие с уровня на следующий, – внутри одного уровня и назад переходы запрещены правилами метода.
  3. Найти в слоистой сети кратчайший путь до стока и пустить по нему поток до упора.
  4. Повторять, пока в слое остаются маршруты: каждый насыщает хотя бы одно ребро и закрывает его до конца разбора.
  5. Маршруты кончились – строить новый слой; слоёв не осталось – поток максимален.

Чем Диница отличается от предшественника?

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

Слой живёт, пока в нём есть непройденные маршруты. Как только каждый упирается в насыщенное ребро, строится следующий слой, и расстояние до стока растёт хотя бы на ребро.

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

Расплата – сложность реализации: кода больше, чем у соседей по семейству, а рекурсия упирается в глубину стека на длинных путях.

Как считает алгоритм?

Работа начинается с двух вершин: истока и стока. От истока алгоритм разбирает соседей по слоям, пока не соберёт кратчайший путь до стока, и сразу пускает по нему поток.

Пример – граф из четырнадцати вершин: рёбра направлены, веса проставлены (рисунок 1). Задача – провести поток из вершины 1 в вершину 13.

image html

Рис. 1. Начальный граф, точка старта вершина 1

Веса на рёбрах – пропускная способность канала, а не расстояние. Алгоритм ищет не короткую дорогу, а широкую: побеждает маршрут, по которому пройдёт больше единиц за один проход.

Поиск в ширину находит кратчайшие пути до стока за три хода: 1–4–10 и 1–5–12 (рисунок 2). Бутылочные горлышки маршрутов – 4 и 9 единиц.

image html

Рис. 2. Кратчайшие пути до стока 1–4–10 и 1–5–12 на первом слое

Кратчайшие пути исчерпаны, строим новый слой. Повторный поиск даёт два пути: 1–3–9–14 и 1–3–6–8, а стартовые 14 единиц делятся на 10 и 4.

image html

Рис. 3. Граф с указанием второй пары кратчайших путей

Ребро 11–9 простаивает по устройству метода: работают только рёбра, ведущие на следующий уровень отдаления от истока. Обе вершины стоят на уровне 2, переход запрещён.

Слой закрыт, поиск в ширину идёт заново. Остаётся единственный путь через вершины 2–11–9–8 (рисунок 4), пять ходов до стока. Канал принимает 5 единиц.

image html

Рис. 4. Граф с единственным оставшимся путём

Путей до стока больше нет, поэтому складываем потоки: 4 + 9 + 10 + 4 + 5 = 32 единицы.

image html

Рис. 5. Итоговая версия графа с максимальными потоками

Пять маршрутов разошлись по трём слоям: два в первом, два во втором и один в третьем. Первый слой дал 13 единиц, второй 14, а третий всего 5 – последний путь длиннее на ход и упирается в самое узкое ребро сети.

Вершина 7 в решении не участвует: ребро ведёт в неё из вершины 8, а выхода к стоку нет. Тупиковые ветви алгоритм отбрасывает на разметке уровней, не тратя на них ходов.

Почему тридцать два – предел?

Ответ проверяют минимальным разрезом: из истока выходят четыре ребра – 5, 14, 4 и 9 единиц, вместе ровно 32, и запас у всех четырёх нулевой.

Совпадение максимального потока с минимальным разрезом – теорема Форда–Фалкерсона, на которой держится всё семейство методов. Любой другой разрез окажется не меньше, поэтому улучшить результат нельзя.

Сколько это стоит?

Временная сложность зависит прежде всего от числа вершин:

T = O(|V|2·|E|),

где T – время работы, V – число вершин, E – количество рёбер.

Память расходуется линейно по размеру графа:

Q = O(V + E),

где Q – объём памяти.

Когда применять алгоритм?

Метод закрывает сетевые задачи: транспортные, водопроводные, информационные. Им распределяют работу между сотрудниками и ресурсы между цехами, ищут совпадения в рекомендательных системах, строят маршруты и потоки пассажиров, балансируют нагрузку и сегментируют изображения.

Сетевые задачи объединяет одна форма: источник, потребитель и каналы с ограниченной пропускной способностью. Максимальный поток отвечает без перебора вариантов.

В чём преимущество Диница?

На крупных графах Диница обгоняет Эдмондса–Карпа. На единичных сетях и двудольных паросочетаниях квадрат числа вершин сменяется квадратным корнем из него.

Единичная сеть – граф, где пропускная способность каждого ребра равна единице. Такие сети возникают в задачах на паросочетания, где ребро либо выбрано, либо нет, третьего не дано.

Где Диница проигрывает?

На малых графах метод избыточен: выигрыш не заметен, а кода в разы больше. Задачи, где у рёбер есть цена, решают специализированные алгоритмы минимальной стоимости.

Что запомнить?

  1. Диница – Форд–Фалкерсон, у которого пути ищут поиском в ширину и раскладывают по слоям равной длины в рёбрах.
  2. Внутри слоя кратчайшие пути равны по числу рёбер, поэтому циклы не мешают счёту.
  3. Блокирующий поток насыщает одно ребро пути, после чего направление закрывается.
  4. Рёбра внутри уровня не работают: ребро 11–9 простояло весь разбор.
  5. Время – O(|V|2·|E|), память – O(V + E): граф из четырнадцати вершин отдал 32 единицы за три слоя разбора.