Изменения

Перейти к: навигация, поиск
Реализация
{{Теорема
|statement=
Пусть:* <tex> G </tex> {{---}} сеть с истоком <tex> s </tex> и стоком <tex> t </tex>.* , <tex> f </tex> {{---}} поток минимальной стоимости в сети <tex> G </tex> среди потоков величины <tex> a </tex>. *, <tex> P </tex> {{---}} путь минимальной стоимости <tex> s \leadsto t</tex> в остаточной сети.
Тогда:
<tex>\forall \delta : 0 \leqslant \delta \leqslant c_f(P)</tex> поток <tex>f + \delta \cdot f_P</tex> {{---}} поток минимальной стоимости среди потоков величины <tex>a + \delta</tex>, где <tex>\delta \cdot f_P</tex> {{---}} поток величины <tex>\delta</tex>, проходящий по пути <tex>P</tex>.
==Алгоритм==
На основании теоремы построим алгоритм.. На каждой итерации алгоритма будем находить путь минимальной стоимости из <tex>s</tex> в <tex>t</tex> в остаточной сети и дополнять поток вдоль него. Выбирать алгоритм для поиска кратчайших путей следует с учетом того, что в ходе алгоритма появляются ребра отрицательного веса.
===РеализацияОписание===
* Начало.
* '''Шаг 1'''. Для каждого ребра зададим поток равный <tex>0</tex>.
* '''Шаг 4'''. Найдем путь <tex>s \leadsto t</tex> c минимальной стоимостью: путь <tex> P</tex>.
* '''Шаг 5'''. Дополним поток <tex>f</tex> вдоль пути <tex>P</tex>.
* '''Шаг 6'''. Поток минимальной стоимости найден, т.к в остаточной пути сети не осталось ни одного пути.
* Конец.
 
===Реализация===
 
Пусть задана структура <tex>Edge</tex>:
'''struct''' edge:
'''int''' from
'''int''' to
'''double''' c <font color=green>// пропускная способность ребра</font>
'''double''' flow <font color=green>// поток через ребро</font>
'''double''' price <font color=green>// стоимость перемещения единицы потока через ребро</font>
 
Будем использовать структуру для хранения ребер графа G.
 
'''Edge[]''' findMinCostMaxFlow(<tex>G: (V, E)</tex>, '''int''' s, '''int''' t):
'''for''' edge '''in''' <tex>E</tex>:
edge.flow = 0
'''while''' <tex>\exists</tex> путь <tex>s \leadsto t</tex> в остаточной сети <tex>G_f</tex>:
P = путь <tex>s \leadsto t</tex> с наименьшей стоимостью.
maxFlow = <tex>\displaystyle \min_{edge \in P} edge.c - edge.flow</tex>
'''for''' edge '''in''' P:
edge.flow += maxFlow
'''return''' <tex>E</tex>
===Асимптотика===
==Источники информации==
*[https://ru.wikipedia.org/wiki/Теорема_Форда_—_Фалкерсона Wikipedia {{---}} Теорема Форда-Фалкерсона]
* Ravindra Ahuja, Thomas Magnanti, James Orlin. Network flows (1993)
== Литература ==
* Ravindra Ahuja, Thomas Magnanti, James Orlin. Network flows (1993)
[[Категория:Алгоритмы и структуры данных]]
[[Категория: Задача о потоке минимальной стоимости]]
147
правок

Навигация