Поток минимальной стоимости

Материал из Викиконспекты
Версия от 19:16, 16 сентября 2019; Prilog (обсуждение | вклад) (Алгоритм: Оказывается бывают отрицательные стоимости)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Задача о потоке минимальной стоимости[править]

Определение:
Пусть дана сеть [math]G(V,E)[/math]. [math]S, T \in V[/math] — источник и сток. Ребра [math](u,v) \in E[/math] имееют пропускную способность [math] c(u, v), [/math] поток [math] f(u,v) [/math] и цену за единицу потока [math]a(u, v) [/math]. Тогда общая стоимость потока из [math]S[/math] в [math]T[/math]:
[math]p(u,v) = \sum\limits_{u,v \in V, f(u,v)\gt 0} a(u,v) \cdot f(u,v)[/math]

Свойства сети[править]

  • Поток не может превысить пропускную способность.
[math]f(u,v) \leqslant c(u,v)[/math]
  • Поток из [math]u[/math] в [math]v[/math] должен быть противоположным потоку из [math]v[/math] в [math]u[/math].
[math]f(u, v)=-f(v, u)[/math]
  • Сохранение потока. Для каждой вершины, сумма входящего и исходящего потоков равно [math]0[/math].
[math] \sum\limits_{w \in V} f(u,w) = 0[/math]


Задача:
Дана сеть [math]G(V,E)[/math]. [math]S, T \in V[/math] — источник и сток. Ребра [math](u,v) \in E[/math] имееют пропускную способность [math] c(u, v), [/math] поток [math] f(u,v) [/math] — и цену за единицу потока [math] a(u, v) [/math]. Требуется найти максимальный поток, суммарная стоимость которого минимальна.


Алгоритмы решения[править]

Метод устранения отрицательных циклов в остаточной сети[править]

Воспользуемся леммой об эквивалентности свойства потока быть минимальной стоимости и отсутствии отрицательных циклов в остаточной сети. Получим следующий алгоритм:

Алгоритм[править]

  • Начало.
  • Шаг 1. Определим для каждого прямого ребра [math](u,v)[/math] обратное ребро [math](v,u)[/math]. Определим его характеристики: [math]c(v,u)=0[/math], [math]f(v,u)=-f(u,v)[/math], [math]a(v,u)=-a(u,v)[/math].
  • Шаг 2. Для каждого ребра зададим поток равный [math]0[/math].
  • Шаг 3. Найдем произвольный максимальный поток(любым алгоритмом нахождения максимального потока), построим для него остаточную сеть, где каждому ребру будет соответствовать величина [math]a(u,v) \cdot (c(u,v) - f(u,v))[/math].
  • Шаг 4. При помощи алгоритма Форда-Беллмана найдем отрицательный цикл в построенной сети. Если отрицательный цикл не нашелся — перейдем к шагу 6.
  • Шаг 5. Избавимся от отрицательного цикла, для этого пустим по нему максимально возможный поток. Величина потока равна минимальной остаточной пропускной способности в цикле. Перейдем к шагу 4.
  • Шаг 6. Отрицательных циклов в остаточной сети нет, значит, максимальный поток минимальной стоимости найден.
  • Конец.

Асимптотика[править]

Алгоритм Форда-Беллмана работает за [math]O(VE)[/math], улучшение цикла за [math]O(E)[/math]. Если обозначить максимальную стоимость потока как [math]C[/math], а максимальную пропускную способность как [math]U[/math], то алгоритм совершит [math]O(ECU)[/math] итераций поиска цикла, если каждое улучшение цикла будет улучшать его на 1. В итоге имеем [math]O(V E^2 C U + maxFlow)[/math], где [math]maxFlow[/math] - асимптотика поиска максимального потока.

Метод дополнения потока вдоль путей минимальной стоимости[править]

Использование потенциалов Джонсона[править]

См. также[править]

Источники информации[править]