Задача о максимальном потоке: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Структура статьи согласно ВП:ОС
 
(не показано 39 промежуточных версий 28 участников)
Строка 1: Строка 1:
[[Файл:Max flow.svg|thumb|upright=1.5|Максимальный поток в транспортной сети. Числа обозначают потоки и пропускные способности.]]
[[Файл:Max flow.svg|thumb|upright=1.5|Максимальный поток в транспортной сети. Числа обозначают потоки и пропускные способности.]]
В [[Оптимизация (математика)|теории оптимизации]] и [[теория графов|теории графов]], '''задача о максимальном потоке''' заключается в нахождении такого потока по [[транспортная сеть|транспортной сети]], что сумма потоков из истока, или, что то же самое, сумма потоков в сток максимальна.
В [[Оптимизация (математика)|теории оптимизации]] и [[теория графов|теории графов]], '''задача о максимальном потоке''' заключается в нахождении такого [[Транспортная сеть#Определения|потока]] по [[транспортная сеть|транспортной сети]], что сумма потоков из истока, или, что то же самое, сумма потоков в сток максимальна.


Задача о максимальном потоке является частным случаем более трудных задач, как например [[задача о циркуляции]].
Задача о максимальном потоке является частным случаем более трудных задач, как например [[задача о циркуляции]].


== История ==
== История ==
После [[Нападение на Пёрл-Харбор|вступления США во Вторую мировую войну]] в 1941 году, математик [[Данциг, Джордж|Джордж Бернард Данциг]] поступил на работу в отдел статистического управления [[ВВС США|Военно-воздушные силы США]] в [[Вашингтон]]е. С 1941 по 1946 годы он возглавлял подразделение анализа военных действий (Combat Analysis Branch), где работал над различными математическими проблемами.<ref>{{MacTutor Biography|id=Dantzig_George|title=George Dantzig}}</ref><ref>Cottle, Richard; Johnson, Ellis; Wets, Roger, [http://www.stanford.edu/group/SOL/GBD/cottle-johnson-wets-2007.pdf «George B. Dantzig (1914—2005)»], ''Notices of the American Mathematical Society'', v.54, no.3, March 2007. Cf. p.348</ref> Впоследствии, используя работу Данцига, задача о максимальном потоке была впервые решена в ходе подготовки воздушного моста во время [[Блокада Западного Берлина|блокады Западного Берлина]], происходившей в 1948—1949 году.<ref name="MIT2010">Hardesty, Larry, [http://web.mit.edu/newsoffice/2010/max-flow-speedup-0927.html «First improvement of fundamental algorithm in 10 years»], MIT News Office, September 27, 2010</ref><ref>Borndörfer, Ralf; Grötschel, Martin; Löbel, Andreas, [http://www.zib.de/Publications/Reports/SC-95-27.pdf «Alcuin’s Transportation Problems and Integer Programing»], ''Konrad-Zuse-Zentrum für Informationstechnik'', Berlin, Germany, November 1995. Cf. p.3</ref><ref>Powell, Stewart M., [http://www.airforce-magazine.com/MagazineArchive/Pages/1998/June%201998/0698berlin.aspx «The Berlin Airlift»], ''Air Force Magazine'', June 1998.</ref>
После [[Нападение на Пёрл-Харбор|вступления США во Вторую мировую войну]] в 1941 году математик [[Данциг, Джордж|Джордж Бернард Данциг]] поступил на работу в отдел статистического управления [[Военно-воздушные силы США|Военно-воздушных сил США]] в [[Вашингтон (округ Колумбия)|Вашингтоне]]. С 1941 по 1946 годы он возглавлял подразделение анализа боевых действий (Combat Analysis Branch), где работал над различными математическими проблемами.<ref>{{MacTutor Biography|id=Dantzig_George|title=George Dantzig}}</ref><ref>Cottle, Richard; Johnson, Ellis; Wets, Roger, [http://www.stanford.edu/group/SOL/GBD/cottle-johnson-wets-2007.pdf «George B. Dantzig (1914—2005)»] {{Wayback|url=http://www.stanford.edu/group/SOL/GBD/cottle-johnson-wets-2007.pdf |date=20150907195444 }}, ''Notices of the American Mathematical Society'', v.54, no.3, March 2007. Cf. p.348</ref> Впоследствии c использованием работы Данцига задача о максимальном потоке была впервые решена в ходе подготовки воздушного моста во время [[Блокада Западного Берлина|блокады Западного Берлина]], происходившей в 1948—1949 году.<ref name="MIT2010">Hardesty, Larry, [http://web.mit.edu/newsoffice/2010/max-flow-speedup-0927.html «First improvement of fundamental algorithm in 10 years»] {{Wayback|url=http://web.mit.edu/newsoffice/2010/max-flow-speedup-0927.html |date=20140328104600 }}, MIT News Office, September 27, 2010</ref><ref>Borndörfer, Ralf; Grötschel, Martin; Löbel, Andreas, [http://www.zib.de/Publications/Reports/SC-95-27.pdf «Alcuin’s Transportation Problems and Integer Programing»] {{Wayback|url=http://www.zib.de/Publications/Reports/SC-95-27.pdf |date=20110807120135 }}, ''Konrad-Zuse-Zentrum für Informationstechnik'', Berlin, Germany, November 1995. Cf. p.3</ref><ref>Powell, Stewart M., [http://www.airforce-magazine.com/MagazineArchive/Pages/1998/June%201998/0698berlin.aspx «The Berlin Airlift»], ''Air Force Magazine'', June 1998.</ref>


В 1951 году Джордж Данциг впервые сформулировал задачу в общем виде.<ref>Dantzig, G.B., [http://cowles.econ.yale.edu/P/cm/m13/m13-23.pdf «Application of the Simplex Method to a Transportation Problem»], in T.C. Koopman (ed.): ''Activity Analysis and Production and Allocation'', New York, (1951) 359—373.</ref>
В 1951 году Джордж Данциг впервые сформулировал задачу в общем виде.<ref>Dantzig, G.B., [http://cowles.econ.yale.edu/P/cm/m13/m13-23.pdf «Application of the Simplex Method to a Transportation Problem»] {{Wayback|url=http://cowles.econ.yale.edu/P/cm/m13/m13-23.pdf |date=20100719015952 }}, in T.C. Koopman (ed.): ''Activity Analysis and Production and Allocation'', New York, (1951) 359—373.</ref>


В 1955 году, [[Форд, Лестер|Лестер Форд]] и {{translation2|Фалкерсон, Делберт|Делберт Фалкерсон||D. R. Fulkerson|Delbert Ray Fulkerson}} впервые построили алгоритм, специально предназначенный для решения этой задачи. Их алгоритм получил название [[алгоритм Форда-Фалкерсона]].<ref>Ford, L.R., Jr.; Fulkerson, D.R., «Maximal Flow through a Network», ''Canadian Journal of Mathematics'' (1956), pp.399-404.</ref><ref>Ford, L.R., Jr.; Fulkerson, D.R., ''Flows in Networks'', Princeton University Press (1962).</ref>
В 1955 году, [[Форд, Лестер|Лестер Форд]] и {{нп2|Фалкерсон, Делберт|Делберт Фалкерсон||D. R. Fulkerson|Delbert Ray Fulkerson}} впервые построили алгоритм, специально предназначенный для решения этой задачи. Их алгоритм получил название [[алгоритм Форда-Фалкерсона]].<ref>Ford, L.R., Jr.; Fulkerson, D.R., «Maximal Flow through a Network», ''Canadian Journal of Mathematics'' (1956), pp.399-404.</ref><ref>Ford, L.R., Jr.; Fulkerson, D.R., ''Flows in Networks'', Princeton University Press (1962).</ref>


В дальнейшем решение задачи много раз улучшалось.
В дальнейшем решение задачи много раз улучшалось.


В 2010 году исследователи Джонатан Кёлнер (Jonathan Kelner) и Александр Мэдри (Aleksander Mądry) из [[Массачусетский Технологический Институт|МТИ]] вместе со своими коллегами Дэниелем Спилманом ([[:en:Daniel Spielman]]) из [[Йельский университет|Йельского уноверситета]] и Шень-Хуа Тенем ([[:en:Shang-Hua Teng]]) из [[Южно-Калифорнийский университет|Южно-Калифорнийского университета]] продемонстрировали очередное улучшение алгоритма, впервые за 10 лет.<ref name="MIT2010"/><ref>Kelner, Jonathan, [http://www.csail.mit.edu/events/eventcalendar/calendar.php?show=event&id=2711 «Electrical Flows, Laplacian Systems and Faster Approximation of Maximum Flow in Undirected Graphs»], talk at CSAIL, MIT, Tuesday, September 28 2010</ref><ref>[http://math.mit.edu/~kelner/Publications/Docs/maxFlow.pdf Electrical Flows, Laplacian Systems, and Faster Approximation of Maximum Flow in Undirected Graphs], by Paul Cristiano et al., October 19, 2010.</ref>
В 2010 году исследователи Джонатан Кёлнер (Jonathan Kelner) и Александер Мондры (Aleksander Mądry) из [[Массачусетский Технологический Институт|МТИ]] вместе со своими коллегами Дэниелем Спилманом ([[:en:Daniel Spielman]]) из [[Йельский университет|Йельского университета]] и Шень-Хуа Тенем ([[:en:Shang-Hua Teng]]) из [[Южно-Калифорнийский университет|Южно-Калифорнийского университета]] продемонстрировали очередное улучшение алгоритма, впервые за 10 лет.<ref name="MIT2010"/><ref>Kelner, Jonathan, [http://www.csail.mit.edu/events/eventcalendar/calendar.php?show=event&id=2711 «Electrical Flows, Laplacian Systems and Faster Approximation of Maximum Flow in Undirected Graphs»] {{Wayback|url=http://www.csail.mit.edu/events/eventcalendar/calendar.php?show=event&id=2711 |date=20110624084844 }}, talk at CSAIL, MIT, Tuesday, September 28 2010</ref><ref>[http://math.mit.edu/~kelner/Publications/Docs/maxFlow.pdf Electrical Flows, Laplacian Systems, and Faster Approximation of Maximum Flow in Undirected Graphs] {{Wayback|url=http://math.mit.edu/~kelner/Publications/Docs/maxFlow.pdf |date=20101129012854 }}, by Paul Cristiano et al., October 19, 2010.</ref>


== Определение ==
== Определение ==
Дана [[транспортная сеть]] <math>\scriptstyle N = (V, E)</math> с источником <math>\scriptstyle s \in V</math>, стоком <math>\scriptstyle t \in V</math> и пропускными способностями <math>\scriptstyle c</math>.
Дана [[транспортная сеть]] <math> N = (V, E) </math> с источником <math> s \in V</math>, стоком <math> t \in V</math> и пропускными способностями <math> c</math>.


: '''Величиной потока''' ('''value of flow''') называется сумма потоков из источника <math>\scriptstyle |f| = \sum_{v \in V} f_{sv}</math>. В статье «[[Транспортная сеть]]» доказано, что она равна сумме потоков в сток <math>\ \sum_{w \in V} f(w,t)</math>.
: '''Величиной [[Транспортная сеть#Определения|потока]]''' ('''value of flow''') называется сумма потоков из источника <math> |f| = \sum_{v \in V} f_{sv}</math>. В статье «[[Транспортная сеть]]» доказано, что она равна сумме потоков в сток <math>\ \sum_{w \in V} f(w,t)</math>.


'''Задача о максимальном потоке''' заключается в нахождении потока такого, что величина потока максимальна.
'''Задача о максимальном потоке''' заключается в нахождении такого потока, где величина потока максимальна.


== Решения ==
== Решения ==
Строка 30: Строка 30:
|-
|-
| [[Линейное программирование]]
| [[Линейное программирование]]
| Зависит от конкретного алгоритма.<br /> Для [[симплекс-метод]]а экспоненциальна.
| Зависит от конкретного алгоритма. Для [[симплекс-метод]]а экспоненциальна.
| Представить задачу о максимальном потоке как задачу линейного программирования. Переменными являются потоки по рёбрам, а ограничениями — сохранение потока и ограничение пропускной способности.
| Представить задачу о максимальном потоке как задачу линейного программирования. Переменными являются потоки по рёбрам, а ограничениями — сохранение потока и ограничение пропускной способности.
|-
|-
| [[Алгоритм Форда-Фалкерсона]]
| [[Алгоритм Форда-Фалкерсона]]
| Зависит от алгоритма поиска увеличивающего пути.<br /> Требует ''O''(max<nowiki>|</nowiki> ''f'' <nowiki>|</nowiki>) таких поисков.
| Зависит от алгоритма поиска увеличивающего пути. Требует <math>O(\max |f|)</math> таких поисков.
| Найти любой увеличивающий путь. Увеличить поток по всем его рёбрам на минимальную из их остаточных пропускных способностей. Повторять, пока увеличивающий путь есть. Алгоритм работает только для целых пропускных способностей. В противном случае, он может работать бесконечно долго, не сходясь к правильному ответу.
| Найти любой увеличивающий путь. Увеличить поток по всем его рёбрам на минимальную из их остаточных пропускных способностей. Повторять, пока увеличивающий путь есть. Алгоритм работает только для целых пропускных способностей. В противном случае он может работать бесконечно долго, не сходясь к правильному ответу.
|-
|-
| [[Алгоритм Эдмондса-Карпа]]
| [[Алгоритм Эдмондса-Карпа]]
| <math>O(|V||E|^2)</math>
| ''O''(''VE''²)
| Выполняем алгоритм Форда-Фалкерсона, каждый раз выбирая ''кратчайший'' увеличивающий путь (находится [[поиск в ширину|поиском в ширину]]).
| Выполняем алгоритм Форда-Фалкерсона, каждый раз выбирая ''кратчайший'' увеличивающий путь (находится [[поиск в ширину|поиском в ширину]]).
|-
|-
| [[Алгоритм Диница]]
| [[Алгоритм Диница]]
| ''O''(''V''²''E'')<br /> <math>\scriptscriptstyle O(V\sqrt{E})</math> для единичных пропускных способностей<br /> <math>O(VE\log(V))</math> с использованием динамических деревьев Слетора и Тарьяна<ref>[http://e-maxx.ru/algo/dinic Алгоритм Диница]</ref>
| <math>O(|V|^2|E|)</math> или <math>O(|V| \surd |E|)</math> для единичных пропускных способностей <math>O(|V||E|\log(|V|))</math> с использованием динамических деревьев Слетора и Тарьяна<ref>{{Cite web |url=http://e-maxx.ru/algo/dinic |title=Алгоритм Диница |access-date=2010-10-28 |archive-date=2015-05-07 |archive-url=https://web.archive.org/web/20150507002725/http://e-maxx.ru/algo/dinic |deadlink=no }}</ref>
| Усовершенствование алгоритма Эдмондса-Карпа (но хронологически был найден раньше). На каждой итерации, используя поиск в ширину, определяем расстояния от источника до всех вершин в остаточной сети. Строим граф, содержащий только такие рёбра остаточной сети, на которых это расстояние растёт на 1. Исключаем из графа все тупиковые вершины с инцидентными им рёбрами, пока все вершины не станут нетупиковыми. (Тупиковой называется вершина, кроме источника и стока, в которую не входит ни одно ребро или из которой не исходит ни одного ребра.) На получившемся графе отыскиваем кратчайший увеличивающий путь (им будет любой путь из s в t). Исключаем из остаточной сети ребро с минимальной пропускной способностью, снова исключаем тупиковые вершины, и так пока увеличивающий путь есть.
| Усовершенствование алгоритма Эдмондса-Карпа (но хронологически был найден раньше). На каждой итерации, используя поиск в ширину, определяем расстояния от источника до всех вершин в остаточной сети. Строим граф, содержащий только такие рёбра остаточной сети, на которых это расстояние растёт на 1. Исключаем из графа все тупиковые вершины с инцидентными им рёбрами, пока все вершины не станут нетупиковыми. (Тупиковой называется вершина, кроме источника и стока, в которую не входит ни одно ребро или из которой не исходит ни одного ребра.) На получившемся графе отыскиваем кратчайший увеличивающий путь (им будет любой путь из s в t). Исключаем из остаточной сети ребро с минимальной пропускной способностью, снова исключаем тупиковые вершины, и так пока увеличивающий путь есть.
|-
|-
| [[Алгоритм проталкивания предпотока]]
| [[Алгоритм проталкивания предпотока]]
| ''O''(''V''²''E'')
| <math>O(|V|^2|E|)</math>
| Вместо потока оперирует с предпотоком. Отличие в том, что для любой вершины u, кроме источника и стока, сумма входящих в неё потоков для потока должна быть строго нулевой (условие сохранения потока), а для предпотока — неотрицательной. Эта сумма называется ''избыточным потоком'' в вершину, а вершина с положительным избыточным потоком называется ''переполненной''. Кроме того, для каждой вершины алгоритм сохраняет дополнительную характеристику, ''высоту'', являющуюся целым неотрицательным числом. Алгоритм использует две операции: ''проталкивание'', когда поток по ребру, идущему из более высокой в более низкую вершину, увеличивается на максимально возможную величину, и ''подъём'', когда переполненная вершина, проталкивание из которой невозможно из-за недостаточной высоты, поднимается. Проталкивание возможно, когда ребро принадлежит остаточной сети, ведёт из более высокой вершины в более низкую, и исходная вершина переполнена. Подъём возможен, когда поднимаемая вершина переполнена, но ни одна из вершин, в которые из неё ведут рёбра остаточной сети, не ниже её. Он совершается до высоты на 1 большей, чем минимальная из высот этих вершин. Изначально высота источника V, по всем рёбрам, исходящим из источника, течёт максимально возможный поток, а остальные высоты и потоки нулевые. Операци проталкивания и подъёма выполняются до тех пор, пока это возможно.
| Вместо потока оперирует с предпотоком. Отличие в том, что для любой вершины u, кроме источника и стока, сумма входящих в неё потоков для потока должна быть строго нулевой (условие сохранения потока), а для предпотока — неотрицательной. Эта сумма называется ''избыточным потоком'' в вершину, а вершина с положительным избыточным потоком называется ''переполненной''. Кроме того, для каждой вершины алгоритм сохраняет дополнительную характеристику, ''высоту'', являющуюся целым неотрицательным числом. Алгоритм использует две операции: ''проталкивание'', когда поток по ребру, идущему из более высокой в более низкую вершину, увеличивается на максимально возможную величину, и ''подъём'', когда переполненная вершина, проталкивание из которой невозможно из-за недостаточной высоты, поднимается. Проталкивание возможно, когда ребро принадлежит остаточной сети, ведёт из более высокой вершины в более низкую, и исходная вершина переполнена. Подъём возможен, когда поднимаемая вершина переполнена, но ни одна из вершин, в которые из неё ведут рёбра остаточной сети, не ниже её. Он совершается до высоты на 1 большей, чем минимальная из высот этих вершин. Изначально высота источника V, по всем рёбрам, исходящим из источника, течёт максимально возможный поток, а остальные высоты и потоки нулевые. Операции проталкивания и подъёма выполняются до тех пор, пока это возможно.
|-
|-
| [[Алгоритм проталкивания предпотока|Алгоритм «поднять в начало»]]
| [[Алгоритм проталкивания предпотока#Алгоритм «поднять в начало»|Алгоритм «поднять в начало»]]
| ''O''(''V''³)<br />''O''(''VE'' log(''V''²/''E'')) с использованием динамических деревьев
| <math>O(|V|^3)</math> или <math>O(|V||E|\log(|V|^2/|E|))</math> с использованием динамических деревьев
| Вариант предыдущего алгоритма, специальным образом определяющий порядок операций проталкивания и подъёма.
| Вариант предыдущего алгоритма, специальным образом определяющий порядок операций проталкивания и подъёма.
|-
|-
|Алгоритм двоичного блокирующего потока {{ref|GR97}}
|Алгоритм двоичного блокирующего потока {{ref|GR97}}
| <math>\scriptscriptstyle O(E\min(V^{2/3},\sqrt{E})\log(V^2/E)\log{\max{|f|}})</math>
| <math>O(|E| \min\{|V|^{2/3}, \surd{|E|}\} \log(|V|^2/|E|) \log(\max|f|))</math>
|}
|}


Для более подробного списка, см. {{ref|GT88}}.
Для более подробного списка, см. {{ref|GT88}} и [[Список алгоритмов#Алгоритмы нахождения максимального потока|Список алгоритмов нахождения максимального потока]].


== Теорема о целом потоке ==
== Теорема о целом потоке ==
'''Если пропускные способности целые, максимальная величина потока тоже целая.'''
'''Если пропускные способности целые, максимальная величина потока тоже целая.'''


Теорема следует, например, из теоремы Форда—Фалкерсона.
Теорема следует, например, из [[Теорема Форда-Фалкерсона|теоремы Форда—Фалкерсона]].


== Обобщения, сводящиеся к исходной задаче ==
== Обобщения, сводящиеся к исходной задаче ==
Строка 78: Строка 78:
=== Ограничение пропускной способности вершин ===
=== Ограничение пропускной способности вершин ===
<!-- [[Файл:Node splitting.svg|thumb|right|Трансформация задачи с ограниченной пропускной способностью вершин к исходной задаче путём расщепления вершин]] — надо загрузить картинку из английского раздела, если это возможно -->
<!-- [[Файл:Node splitting.svg|thumb|right|Трансформация задачи с ограниченной пропускной способностью вершин к исходной задаче путём расщепления вершин]] — надо загрузить картинку из английского раздела, если это возможно -->
Каждую вершину v с ограниченной пропускной способностью <math>c_v</math> расщепляем на две вершины v<sub>in</sub> и v<sub>out</sub>. Все рёбра, до расщепления входящие в v, теперь входят в v<sub>in</sub>. Все рёбра, до расщепления исходящие из v, теперь исходят из v<sub>out</sub>. Добавляем ребро (v<sub>in</sub>,v<sub>out</sub>) с пропускной способностью <math>c_v</math>.<!-- надо перевести ещё этот раздел == Другие задачи, сводящиеся к данной == === Minimum path cover in directed acyclic graph === Given a [[directed acyclic graph]] ''G'' = (''V'', ''E''), we are to find the minimum number of [[Path (graph theory)|paths]] to cover each vertex in ''V''. We can construct a bipartite graph ''G''<nowiki>'</nowiki> = (''V''<sub>''out''</sub>∪''V''<sub>''in''</sub>, ''E''<nowiki>'</nowiki>) from ''G'', where # ''V''<sub>''out''</sub> = {''v''∈''V'': ''v'' has positive out-degree}. # ''V''<sub>''in''</sub> = {''v''∈''V'': ''v'' has positive in-degree}. # ''E''<nowiki>'</nowiki> = {(''u'',''v'')∈(''V''<sub>''out''</sub>,''V''<sub>''in''</sub>): (''u'',''v'')∈''E''}. Then it can be shown that ''G''<nowiki>'</nowiki> has a matching of size ''m'' if and only if there exists ''n''-''m'' paths that cover each vertex in ''G'', where ''n'' is the number of vertices in ''G''. Therefore, the problem can be solved by finding the maximum cardinality matching in ''G''<nowiki>'</nowiki> instead. === Maximum cardinality bipartite matching === [[Файл:Maximum bipartite matching to max flow.svg|thumb|right|Fig. 4.3.1. Transformation of a maximum bipartite matching problem into a maximum flow problem]] Given a [[bipartite graph]] ''G'' = (''X''∪''Y'', ''E''), we are to find a [[maximum cardinality matching]] in ''G'', that is a matching that contains the largest possible number of edges. This problem can be transformed into a maximum flow problem by constructing a network ''N'' = (''X''∪''Y''∪{''s'',''t''}, ''E''<nowiki>'</nowiki> }, where # ''E''' contains the edges in ''G'' directed from ''X'' to ''Y''. # (''s'',''x'')∈''E''<nowiki>'</nowiki> for each ''x''∈''X'' and (''y'',''t'')∈''E''<nowiki>'</nowiki> for each ''y''∈''Y''. # ''c''(''e'') = 1 for each ''e''∈''E''' (See Fig. 4.3.1). Then the value of the maximum flow in ''N'' is equal to the size of the maximum matching in ''G''. === Maximum independent path === Given a directed graph ''G'' = (''V'', ''E'') and two vertices ''s'' and ''t'', we are to find the maximum number of independent paths from ''s'' to ''t''. Two paths are said to be independent if they do not have a vertex in common apart from ''s'' and ''t''. We can construct a network ''N'' = (''V'', ''E'') from ''G'' with vertex capacities, where # ''s'' and ''t'' are the source and the sink of ''N'' respectively. # ''c''(''v'') = 1 for each ''v''∈''V''. # ''c''(''e'') = 1 for each ''e''∈''E''. Then the value of the maximum flow is equal to the maximum number of independent paths from ''s'' to ''t''. === Maximum edge-disjoint path === Given a directed graph ''G'' = (''V'', ''E'') and two vertices ''s'' and ''t'', we are to find the maximum number of edge-disjoint paths from ''s'' to ''t''. This problem can be transformed to a maximum flow problem by constructing a network ''N'' = (''V'', ''E'') from ''G'' with ''s'' and ''t'' being the source and the sink of ''N'' respectively and assign each edge with unit capacity. -->
Каждую вершину v с ограниченной пропускной способностью <math>c_v</math> расщепляем на две вершины v<sub>in</sub> и v<sub>out</sub>. Все рёбра, до расщепления входящие в v, теперь входят в v<sub>in</sub>. Все рёбра, до расщепления исходящие из v, теперь исходят из v<sub>out</sub>. Добавляем ребро (v<sub>in</sub>,v<sub>out</sub>) с пропускной способностью <math>c_v</math>.
=== Ограничение пропускной способности рёбер снизу<!-- Алгоритм преобразования графа требует иллюстрации -->===
В данном варианте постановки задачи значение потока каждого ребра дополнительно ограничено снизу функцией <math>c'\colon E \to \mathbb{N}^+</math>. Таким образом величина потока для любого ребра не может превысить его пропускную способность, но и не может быть меньше заданного минимума, т.е. <math>c'(e) \leqslant f(e) \leqslant c(e)</math>. Для решения задачи необходимо преобразовать исходную транспортную сеть <math>G = (V, E, s, t, c, c')</math> в транспортную сеть <math>G' = (V', E', s', t', c'')</math> следующим образом:


# Добавь новые источник <math>s'</math> и сток <math>t'</math>.
<!--
# Для каждого ребра <math>(v, w)</math>:
надо перевести ещё этот раздел
## Создай две новые вершины <math>x</math> и <math>y</math>.
## Установи <math>c''(v, x) = c(v, w)</math> и <math>c''(y, w) = c(v, w)</math>.
## Установи <math>c''(x, y) = c(v, w) - c'(v, w)</math>.
## Установи <math>c''(s', y) = c'(v, w)</math> и <math>c''(x, t') = c'(v, w)</math>.
# Установи <math>c''(t, t') = c''(s, s') = \sum_{e \in E}c(e)</math>.


В <math>G</math> определён поток, удовлетворяющий условию об ограничении пропускной способности ребёр снизу, тогда и только тогда, когда в <math>G'</math> определен максимальный поток, в котором все рёбра вида <math>(s', y)</math> и <math>(x, t')</math> "насыщены". Благодаря такому построению алгоритм нахождения потока, ограниченного снизу будет следующим:
== Другие задачи, сводящиеся к данной ==


# Из <math>G</math> построй <math>G'</math>.
=== Minimum path cover in directed acyclic graph ===
# Найди поток <math>f'</math> графа <math>G'</math>, предпочитая рёбра вида <math>(s', y)</math> и <math>(x, t')</math>.
Given a [[directed acyclic graph]] ''G'' = (''V'', ''E''), we are to find the minimum number of [[Path (graph theory)|paths]] to cover each vertex in ''V''. We can construct a bipartite graph ''G''<nowiki>'</nowiki> = (''V''<sub>''out''</sub>∪''V''<sub>''in''</sub>, ''E''<nowiki>'</nowiki>) from ''G'', where
# Если <math>f' < f'' + \sum_{e \in E(G)} c'(e)</math>, где <math>f''</math> - поток графа <math>G</math>, в котором опущена пропускная способность рёбер снизу, то решения не существует.
# ''V''<sub>''out''</sub> = {''v''∈''V'': ''v'' has positive out-degree}.
# Иначе вычисли поток <math>f</math> из потока <math>f'</math>, т.е. <math>f(a, b) = f(a, x)</math>.<!-- Добавить доказательство -->
# ''V''<sub>''in''</sub> = {''v''∈''V'': ''v'' has positive in-degree}.
# ''E''<nowiki>'</nowiki> = {(''u'',''v'')∈(''V''<sub>''out''</sub>,''V''<sub>''in''</sub>): (''u'',''v'')∈''E''}.
Then it can be shown that ''G''<nowiki>'</nowiki> has a matching of size ''m'' if and only if there exists ''n''-''m'' paths that cover each vertex in ''G'', where ''n'' is the number of vertices in ''G''. Therefore, the problem can be solved by finding the maximum cardinality matching in ''G''<nowiki>'</nowiki> instead.


=== Ограничение пропускной способности рёбер снизу с альтернативой ===
=== Maximum cardinality bipartite matching ===
Такой вариант задачи идентичен предыдущему с той разницей, что значение потока для каждого ребра может быть также равно <math>0</math>, т.е. <math>c'(e) \leqslant f(e) \leqslant c(e)</math> или <math>f(e) = 0</math>. Несмотря на незначительное изменение условия, не существует полиноминального решения данной проблемы, если классы [[Класс P|''P'']] и [[Класс NP|''NP'']] не [[Равенство классов P и NP|равны]]. В качестве доказательства утверждения можно привести полиноминальную редукцию к проблеме [[:en:Boolean_satisfiability_problem#3-satisfiability|Exact-3-SAT]].<!-- Привести доказательство -->
[[Файл:Maximum bipartite matching to max flow.svg|thumb|right|Fig. 4.3.1. Transformation of a maximum bipartite matching problem into a maximum flow problem]]
Given a [[bipartite graph]] ''G'' = (''X''∪''Y'', ''E''), we are to find a [[maximum cardinality matching]] in ''G'', that is a matching that contains the largest possible number of edges. This problem can be transformed into a maximum flow problem by constructing a network ''N'' = (''X''∪''Y''∪{''s'',''t''}, ''E''<nowiki>'</nowiki> }, where
# ''E''' contains the edges in ''G'' directed from ''X'' to ''Y''.
# (''s'',''x'')∈''E''<nowiki>'</nowiki> for each ''x''∈''X'' and (''y'',''t'')∈''E''<nowiki>'</nowiki> for each ''y''∈''Y''.
# ''c''(''e'') = 1 for each ''e''∈''E''' (See Fig. 4.3.1).

Then the value of the maximum flow in ''N'' is equal to the size of the maximum matching in ''G''.

=== Maximum independent path ===
Given a directed graph ''G'' = (''V'', ''E'') and two vertices ''s'' and ''t'', we are to find the maximum number of independent paths from ''s'' to ''t''. Two paths are said to be independent if they do not have a vertex in common apart from ''s'' and ''t''. We can construct a network ''N'' = (''V'', ''E'') from ''G'' with vertex capacities, where
# ''s'' and ''t'' are the source and the sink of ''N'' respectively.
# ''c''(''v'') = 1 for each ''v''∈''V''.
# ''c''(''e'') = 1 for each ''e''∈''E''.
Then the value of the maximum flow is equal to the maximum number of independent paths from ''s'' to ''t''.

=== Maximum edge-disjoint path ===
Given a directed graph ''G'' = (''V'', ''E'') and two vertices ''s'' and ''t'', we are to find the maximum number of edge-disjoint paths from
''s'' to ''t''. This problem can be transformed to a maximum flow problem by constructing a network ''N'' = (''V'', ''E'') from ''G'' with ''s'' and ''t'' being the source and the sink of ''N'' respectively and assign each edge with unit capacity.

-->


== См. также ==
== См. также ==
* [[Поток минимальной стоимости]]
* [[Поток минимальной стоимости]]
* [[Транспортная сеть]]
* [[Транспортная сеть]]

== Литература ==
* Schrijver, Alexander, [http://homepages.cwi.nl/~lex/files/histtrpclean.pdf «On the history of the transportation and maximum flow problems»], ''Mathematical Programming'' 91 (2002) 437—445
* {{книга
|автор = Томас Х. Кормен и др.
|заглавие = Алгоритмы: построение и анализ
|оригинал = INTRODUCTION TO ALGORITHMS
|ссылка =
|издание = 2-е изд
|место = М.
|издательство = [[Вильямс (издательство)|«Вильямс»]]
|год = 2006
|страницы = 1296
|isbn = 0-07-013151-1
}}, глава 26. Максимальный поток.


== Примечания ==
== Примечания ==
{{примечания}}
{{примечания}}

== Литература ==
== Литература ==
* Schrijver, Alexander, [http://homepages.cwi.nl/~lex/files/histtrpclean.pdf «On the history of the transportation and maximum flow problems»], ''Mathematical Programming'' 91 (2002) 437—445
* {{Note|GR97}}{{cite journal
* {{Книга:CLRS}}. Глава 26. Максимальный поток.
| author = [[:en:Andrew V. Goldberg|Andrew V. Goldberg]] and [[:en:S. Rao|S. Rao]]
* {{Note|GR97}}{{статья
| title = Beyond the flow decomposition barrier
|заглавие=Beyond the flow decomposition barrier
| journal = J. Assoc. Comput. Mach.
|издание=J. Assoc. Comput. Mach.
| volume = 45
|том=45
| pages = 753&ndash;782
|страницы=753—782
| year = 1998
| doi = 10.1145/290179.290181
|doi=10.1145/290179.290181
|язык=und
}}
|автор=[[:en:Andrew V. Goldberg|Andrew V. Goldberg]] and [[:en:S. Rao|S. Rao]]
* {{Note|GT88}}{{cite journal
|год=1998}}
| author = [[:en:Andrew V. Goldberg|Andrew V. Goldberg]] and [[Тарьян, Роберт|Robert E. Tarjan]]
* {{Note|GT88}}{{статья
| title = A new approach to the maximum-flow problem
|заглавие=A new approach to the maximum-flow problem
| journal = Journal of the ACM
|издание=[[Journal of the ACM]]
| volume = 35
|том=35
| year = 1988
| issn = 0004-5411
|issn=0004-5411
|страницы=921—940
| pages = 921&ndash;940
| doi = 10.1145/48014.61051
|doi=10.1145/48014.61051
| publisher = ACM Press
|издательство=ACM Press
| address = New York, New York, U.S.
|address=New York, New York, U.S.
|номер=4
| issue = 4
|язык=en
}}
|автор=[[:en:Andrew V. Goldberg|Andrew V. Goldberg]] and [[Тарьян, Роберт|Robert E. Tarjan]]
* {{Note|HA99}}{{cite journal
|год=1988
| author = [[:en:Joseph Cheriyan|Joseph Cheriyan]] and [[:en:Kurt Mehlhorn|Kurt Mehlhorn]]
|тип=journal}}
| title = An analysis of the highest-level selection rule in the preflow-push max-flow algorithm
* {{Note|HA99}}{{статья
| journal = Information Processing Letters
|заглавие=An analysis of the highest-level selection rule in the preflow-push max-flow algorithm
| volume = 69
|издание={{Нп3|Information Processing Letters}}
| year = 1999
|том=69
| pages = 239&ndash;242
|страницы=239—242
| doi = 10.1016/S0020-0190(99)00019-8
|doi=10.1016/S0020-0190(99)00019-8
| issue = 5
|номер=5
}}
|язык=en
* {{Note|ST83}}{{cite journal
|тип=journal
| author = [[:en:Daniel D. Sleator|Daniel D. Sleator]] and [[Тарьян, Роберт|Robert E. Tarjan]]
|автор=[[:en:Joseph Cheriyan|Joseph Cheriyan]] and [[:en:Kurt Mehlhorn|Kurt Mehlhorn]]
| title = A data structure for dynamic trees
|год=1999}}
| journal = Journal of Computer and System Sciences
* {{Note|ST83}}{{статья
| volume = 26
|заглавие=A data structure for dynamic trees
| year = 1983
|издание={{Нп3|Journal of Computer and System Sciences}}
| issn = 0022-0000
|том=26
| pages = 362&ndash;391
| doi = 10.1016/0022-0000(83)90006-5
|issn=0022-0000
|страницы=362—391
| url = http://www.cs.cmu.edu/~sleator/papers/dynamic-trees.pdf
|doi=10.1016/0022-0000(83)90006-5
| issue = 3
|ссылка=http://www.cs.cmu.edu/~sleator/papers/dynamic-trees.pdf
}}
|номер=3
* {{Note|ST85}}{{cite journal
|язык=en
| author = [[:en:Daniel D. Sleator|Daniel D. Sleator]] and [[Тарьян, Роберт|Robert E. Tarjan]]
|автор=[[:en:Daniel D. Sleator|Daniel D. Sleator]] and [[Тарьян, Роберт|Robert E. Tarjan]]
| title = Self-adjusting binary search trees
|год=1983
| journal = Journal of the ACM
|тип=journal}}
| volume = 32
* {{Note|ST85}}{{статья
| year = 1985
|заглавие=Self-adjusting binary search trees
| issn = 0004-5411
|издание=[[Journal of the ACM]]
| pages = 652&ndash;686
|том=32
| doi = 10.1145/3828.3835
|issn=0004-5411
| publisher = ACM Press
|страницы=652—686
| address = New York, New York, U.S.
|doi=10.1145/3828.3835
| url = http://www.cs.cmu.edu/~sleator/papers/self-adjusting.pdf
|издательство=ACM Press
| issue = 3
|address=New York, New York, U.S.
}}
|ссылка=http://www.cs.cmu.edu/~sleator/papers/self-adjusting.pdf
* {{книга
|номер=3
|автор = Томас Х. Кормен и др.
|язык=en
|заглавие = Алгоритмы: построение и анализ
|автор=[[:en:Daniel D. Sleator|Daniel D. Sleator]] and [[Тарьян, Роберт|Robert E. Tarjan]]
|оригинал = INTRODUCTION TO ALGORITHMS
|год=1985
|ссылка =
|тип=journal}}
|издание = 2-е изд
* {{книга |заглавие=Combinatorial Optimization: Networks and Matroids |часть=4. Network Flows |год=2001 |издательство=Dover |isbn=0486414531 |страницы=109—177 |язык=en |автор={{Нп3|Eugene Lawler|Eugene Lawler|en|Eugene Lawler}}}}
|место = М.
|издательство = [[Вильямс (издательство)|«Вильямс»]]
|год = 2006
|страницы = 1296
|isbn = 0-07-013151-1
}}, глава 26. Максимальный поток.
* {{cite book | author = Eugene Lawler | authorlink = Eugene Lawler | title = Combinatorial Optimization: Networks and Matroids | chapter = 4. Network Flows | year = 2001 | publisher = Dover | isbn = 0486414531 | pages = 109–177}}


[[Категория:Алгоритмы на графах]]
[[Категория:Алгоритмы на графах]]

[[ca:Problema del flux màxim]]
[[en:Maximum flow problem]]
[[fa:مسئله بیشینه جریان]]
[[fr:Problème de flot maximum]]
[[ja:最大フロー問題]]
[[pl:Problem maksymalnego przepływu]]
[[pt:Problema da vazão máxima]]

Текущая версия от 17:07, 4 ноября 2023

Максимальный поток в транспортной сети. Числа обозначают потоки и пропускные способности.

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

Задача о максимальном потоке является частным случаем более трудных задач, как например задача о циркуляции.

После вступления США во Вторую мировую войну в 1941 году математик Джордж Бернард Данциг поступил на работу в отдел статистического управления Военно-воздушных сил США в Вашингтоне. С 1941 по 1946 годы он возглавлял подразделение анализа боевых действий (Combat Analysis Branch), где работал над различными математическими проблемами.[1][2] Впоследствии c использованием работы Данцига задача о максимальном потоке была впервые решена в ходе подготовки воздушного моста во время блокады Западного Берлина, происходившей в 1948—1949 году.[3][4][5]

В 1951 году Джордж Данциг впервые сформулировал задачу в общем виде.[6]

В 1955 году, Лестер Форд и Делберт Фалкерсон (англ. Delbert Ray Fulkerson) впервые построили алгоритм, специально предназначенный для решения этой задачи. Их алгоритм получил название алгоритм Форда-Фалкерсона.[7][8]

В дальнейшем решение задачи много раз улучшалось.

В 2010 году исследователи Джонатан Кёлнер (Jonathan Kelner) и Александер Мондры (Aleksander Mądry) из МТИ вместе со своими коллегами Дэниелем Спилманом (en:Daniel Spielman) из Йельского университета и Шень-Хуа Тенем (en:Shang-Hua Teng) из Южно-Калифорнийского университета продемонстрировали очередное улучшение алгоритма, впервые за 10 лет.[3][9][10]

Определение

[править | править код]

Дана транспортная сеть с источником , стоком и пропускными способностями .

Величиной потока (value of flow) называется сумма потоков из источника . В статье «Транспортная сеть» доказано, что она равна сумме потоков в сток .

Задача о максимальном потоке заключается в нахождении такого потока, где величина потока максимальна.

Следующая таблица перечисляет некоторые алгоритмы решения задачи.

Метод Сложность Описание
Линейное программирование Зависит от конкретного алгоритма. Для симплекс-метода экспоненциальна. Представить задачу о максимальном потоке как задачу линейного программирования. Переменными являются потоки по рёбрам, а ограничениями — сохранение потока и ограничение пропускной способности.
Алгоритм Форда-Фалкерсона Зависит от алгоритма поиска увеличивающего пути. Требует таких поисков. Найти любой увеличивающий путь. Увеличить поток по всем его рёбрам на минимальную из их остаточных пропускных способностей. Повторять, пока увеличивающий путь есть. Алгоритм работает только для целых пропускных способностей. В противном случае он может работать бесконечно долго, не сходясь к правильному ответу.
Алгоритм Эдмондса-Карпа Выполняем алгоритм Форда-Фалкерсона, каждый раз выбирая кратчайший увеличивающий путь (находится поиском в ширину).
Алгоритм Диница или для единичных пропускных способностей с использованием динамических деревьев Слетора и Тарьяна[11] Усовершенствование алгоритма Эдмондса-Карпа (но хронологически был найден раньше). На каждой итерации, используя поиск в ширину, определяем расстояния от источника до всех вершин в остаточной сети. Строим граф, содержащий только такие рёбра остаточной сети, на которых это расстояние растёт на 1. Исключаем из графа все тупиковые вершины с инцидентными им рёбрами, пока все вершины не станут нетупиковыми. (Тупиковой называется вершина, кроме источника и стока, в которую не входит ни одно ребро или из которой не исходит ни одного ребра.) На получившемся графе отыскиваем кратчайший увеличивающий путь (им будет любой путь из s в t). Исключаем из остаточной сети ребро с минимальной пропускной способностью, снова исключаем тупиковые вершины, и так пока увеличивающий путь есть.
Алгоритм проталкивания предпотока Вместо потока оперирует с предпотоком. Отличие в том, что для любой вершины u, кроме источника и стока, сумма входящих в неё потоков для потока должна быть строго нулевой (условие сохранения потока), а для предпотока — неотрицательной. Эта сумма называется избыточным потоком в вершину, а вершина с положительным избыточным потоком называется переполненной. Кроме того, для каждой вершины алгоритм сохраняет дополнительную характеристику, высоту, являющуюся целым неотрицательным числом. Алгоритм использует две операции: проталкивание, когда поток по ребру, идущему из более высокой в более низкую вершину, увеличивается на максимально возможную величину, и подъём, когда переполненная вершина, проталкивание из которой невозможно из-за недостаточной высоты, поднимается. Проталкивание возможно, когда ребро принадлежит остаточной сети, ведёт из более высокой вершины в более низкую, и исходная вершина переполнена. Подъём возможен, когда поднимаемая вершина переполнена, но ни одна из вершин, в которые из неё ведут рёбра остаточной сети, не ниже её. Он совершается до высоты на 1 большей, чем минимальная из высот этих вершин. Изначально высота источника V, по всем рёбрам, исходящим из источника, течёт максимально возможный поток, а остальные высоты и потоки нулевые. Операции проталкивания и подъёма выполняются до тех пор, пока это возможно.
Алгоритм «поднять в начало» или с использованием динамических деревьев Вариант предыдущего алгоритма, специальным образом определяющий порядок операций проталкивания и подъёма.
Алгоритм двоичного блокирующего потока [1]

Для более подробного списка, см. [2] и Список алгоритмов нахождения максимального потока.

Теорема о целом потоке

[править | править код]

Если пропускные способности целые, максимальная величина потока тоже целая.

Теорема следует, например, из теоремы Форда—Фалкерсона.

Обобщения, сводящиеся к исходной задаче

[править | править код]

Некоторые обобщения задачи о максимальном потоке легко сводятся к исходной задаче.

Произвольное число источников и/или стоков

[править | править код]

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

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

Неориентированные рёбра

[править | править код]

Каждое неориентированное ребро (u, v) заменяем на пару ориентированных рёбер (u, v) и (v, u).

Ограничение пропускной способности вершин

[править | править код]

Каждую вершину v с ограниченной пропускной способностью расщепляем на две вершины vin и vout. Все рёбра, до расщепления входящие в v, теперь входят в vin. Все рёбра, до расщепления исходящие из v, теперь исходят из vout. Добавляем ребро (vin,vout) с пропускной способностью .

Ограничение пропускной способности рёбер снизу

[править | править код]

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

  1. Добавь новые источник и сток .
  2. Для каждого ребра :
    1. Создай две новые вершины и .
    2. Установи и .
    3. Установи .
    4. Установи и .
  3. Установи .

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

  1. Из построй .
  2. Найди поток графа , предпочитая рёбра вида и .
  3. Если , где - поток графа , в котором опущена пропускная способность рёбер снизу, то решения не существует.
  4. Иначе вычисли поток из потока , т.е. .

Ограничение пропускной способности рёбер снизу с альтернативой

[править | править код]

Такой вариант задачи идентичен предыдущему с той разницей, что значение потока для каждого ребра может быть также равно , т.е. или . Несмотря на незначительное изменение условия, не существует полиноминального решения данной проблемы, если классы P и NP не равны. В качестве доказательства утверждения можно привести полиноминальную редукцию к проблеме Exact-3-SAT.

Примечания

[править | править код]
  1. Джон Дж. О’Коннор и Эдмунд Ф. Робертсон. George Dantzig (англ.) — биография в архиве MacTutor.
  2. Cottle, Richard; Johnson, Ellis; Wets, Roger, «George B. Dantzig (1914—2005)» Архивная копия от 7 сентября 2015 на Wayback Machine, Notices of the American Mathematical Society, v.54, no.3, March 2007. Cf. p.348
  3. 1 2 Hardesty, Larry, «First improvement of fundamental algorithm in 10 years» Архивная копия от 28 марта 2014 на Wayback Machine, MIT News Office, September 27, 2010
  4. Borndörfer, Ralf; Grötschel, Martin; Löbel, Andreas, «Alcuin’s Transportation Problems and Integer Programing» Архивная копия от 7 августа 2011 на Wayback Machine, Konrad-Zuse-Zentrum für Informationstechnik, Berlin, Germany, November 1995. Cf. p.3
  5. Powell, Stewart M., «The Berlin Airlift», Air Force Magazine, June 1998.
  6. Dantzig, G.B., «Application of the Simplex Method to a Transportation Problem» Архивная копия от 19 июля 2010 на Wayback Machine, in T.C. Koopman (ed.): Activity Analysis and Production and Allocation, New York, (1951) 359—373.
  7. Ford, L.R., Jr.; Fulkerson, D.R., «Maximal Flow through a Network», Canadian Journal of Mathematics (1956), pp.399-404.
  8. Ford, L.R., Jr.; Fulkerson, D.R., Flows in Networks, Princeton University Press (1962).
  9. Kelner, Jonathan, «Electrical Flows, Laplacian Systems and Faster Approximation of Maximum Flow in Undirected Graphs» Архивная копия от 24 июня 2011 на Wayback Machine, talk at CSAIL, MIT, Tuesday, September 28 2010
  10. Electrical Flows, Laplacian Systems, and Faster Approximation of Maximum Flow in Undirected Graphs Архивная копия от 29 ноября 2010 на Wayback Machine, by Paul Cristiano et al., October 19, 2010.
  11. Алгоритм Диница. Дата обращения: 28 октября 2010. Архивировано 7 мая 2015 года.

Литература

[править | править код]
  • Schrijver, Alexander, «On the history of the transportation and maximum flow problems», Mathematical Programming 91 (2002) 437—445
  • Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Алгоритмы: построение и анализ = Introduction to Algorithms / Под ред. И. В. Красикова. — 2-е изд. — М.: Вильямс, 2005. — 1296 с. — ISBN 5-8459-0857-4.. Глава 26. Максимальный поток.
  •  Andrew V. Goldberg and S. Rao. Beyond the flow decomposition barrier (неопр.) // J. Assoc. Comput. Mach.. — 1998. — Т. 45. — С. 753—782. — doi:10.1145/290179.290181.
  •  Andrew V. Goldberg and Robert E. Tarjan. A new approach to the maximum-flow problem (англ.) // Journal of the ACM : journal. — ACM Press, 1988. — Vol. 35, no. 4. — P. 921—940. — ISSN 0004-5411. — doi:10.1145/48014.61051.
  •  Joseph Cheriyan and Kurt Mehlhorn. An analysis of the highest-level selection rule in the preflow-push max-flow algorithm (англ.) // Information Processing Letters[англ.] : journal. — 1999. — Vol. 69, no. 5. — P. 239—242. — doi:10.1016/S0020-0190(99)00019-8.
  •  Daniel D. Sleator and Robert E. Tarjan. A data structure for dynamic trees (англ.) // Journal of Computer and System Sciences[англ.] : journal. — 1983. — Vol. 26, no. 3. — P. 362—391. — ISSN 0022-0000. — doi:10.1016/0022-0000(83)90006-5.
  •  Daniel D. Sleator and Robert E. Tarjan. Self-adjusting binary search trees (англ.) // Journal of the ACM : journal. — ACM Press, 1985. — Vol. 32, no. 3. — P. 652—686. — ISSN 0004-5411. — doi:10.1145/3828.3835.
  • Eugene Lawler[англ.]. 4. Network Flows // Combinatorial Optimization: Networks and Matroids (англ.). — Dover, 2001. — P. 109—177. — ISBN 0486414531.