← Все вопросы

Масштабирование потока (capacity scaling) — зачем нужно и как ускоряет Форда-Фалкерсона?

Задан 6 месяцев назад872 просмотров2 ответа
7

Встретил термин «capacity scaling» (масштабирование по пропускной способности) для max-flow. В чём идея этого приёма, как он улучшает асимптотику по сравнению с наивным Форд-Фалкерсоном, и стоит ли его писать на олимпиаде вместо Диница?

2 ответа

12
✓ Принятый ответ — помог автору

Идея масштабирования. Наивный Форд-Фалкерсон плох, когда пропускные большие: он может пускать поток по «тонким» путям много раз. Scaling заставляет алгоритм сначала работать только с толстыми рёбрами.

Заводим порог Δ\Delta, начиная с наибольшей степени двойки ≤max⁡cap\le \max cap. На каждой «фазе масштабирования»:

  • ищем увеличивающие пути, используя только рёбра с остаточной пропускной ≥Δ\ge \Delta;
  • когда таких путей не осталось — делим Δ\Delta пополам и повторяем;
  • заканчиваем, когда Δ<1\Delta < 1.

Так мы сначала «грубо» набираем поток крупными порциями, потом уточняем. Это гарантирует, что число увеличивающих путей в каждой фазе ограничено O(E)O(E).

Асимптотика: O(E2log⁡U)O(E^2 \log U), где U=max⁡capU = \max cap. Это убирает зависимость от величины потока (в отличие от наивного O(E⋅flow)O(E\cdot\text{flow})) и заменяет её логарифмом от максимальной пропускной — отлично при больших cap и небольшом числе рёбер.

// внутри Форд-Фалкерсона с DFS:
for(long long D = highestPowerOfTwo(maxCap); D >= 1; D >>= 1){
    while(dfs_with_threshold(s, t, D)) // ищет путь с остатками >= D
        ; // пускаем поток
}

Стоит ли писать на олимпиаде? Обычно нет: Диниц (O(V2E)O(V^2E), а на единичных ещё лучше) на практике быстрее и его реализация привычнее. Scaling полезно знать концептуально и для теоретических оценок, а также для некоторых вариантов min-cost flow (cost scaling). Но как рабочую лошадку для max-flow держите Диница.

4

Концептуально масштабирование родственно идее «двоичного» приближения: каждая фаза с порогом Δ\Delta устраняет старший бит «недобора» потока. После фазы Δ\Delta остаточный поток (расстояние до оптимума) ограничен E⋅ΔE\cdot\Delta, и при делении Δ\Delta пополам он быстро сходится. Этот же приём масштабирования (но по стоимости) даёт улучшенные алгоритмы min-cost flow — там он реально применяется чаще, чем scaling для обычного max-flow.

Ваш ответ

, чтобы ответить на вопрос.