Алгоритм Эдмондса-Карпа — различия между версиями
(→Оценка быстродействия) |
(→Оценка быстродействия) |
||
Строка 50: | Строка 50: | ||
}} | }} | ||
− | Если увеличивающий путь находить поиском в ширину, то каждую итерацию цикла '''while''' можно выполнить за время <tex>O(E)</tex>. Инициализация в процедуре '''Edmonds_Karp''' производится за <tex>O(E)</tex>, следовательно время работы алгоритма алгоритма Эдмондса-Карпа составляет <tex>O(V E^2)</tex>. Заметим также, что сущетсвует сеть "грибок"<ref>[https://www.topcoder.com/community/data-science/data-science-tutorials/maximum-flow-augmenting-path-algorithms-comparison/#! | + | Если увеличивающий путь находить поиском в ширину, то каждую итерацию цикла '''while''' можно выполнить за время <tex>O(E)</tex>. Инициализация в процедуре '''Edmonds_Karp''' производится за <tex>O(E)</tex>, следовательно время работы алгоритма алгоритма Эдмондса-Карпа составляет <tex>O(V E^2)</tex>. Заметим также, что сущетсвует сеть "грибок"<ref>[https://www.topcoder.com/community/data-science/data-science-tutorials/maximum-flow-augmenting-path-algorithms-comparison/#! статья на TopCoder.com ]</ref> на которой нижняя граница времени работы алгоритмы Эдмондса-Карпа также составляет <tex>\Omega(V E^2)</tex>. |
==Примечания== | ==Примечания== |
Версия 12:22, 5 декабря 2015
Содержание
Алгоритм
Для заданной сети
алгоритм Эдмондса-Карпа находит поток максимальной величины из заданного истока в заданный сток за .Псевдокод
Edmonds_Karp (G, s, t) for (для) каждого ребраdo while существует кратчайший путь из в в остаточной сети do for (для) каждого ребра do
Корректность алгоритма Эдмондса-Карпа
Алгоритм Эдмондса-Карпа является реализацией метода Форда-Фалкерсона. На каждой итерации цикла while поток в графе увеличивается вдоль одного из кратчайших путей в из истока в сток . Этот процесс повторяется до тех пор пока существует кратчайший путь в . Если в не существует кратчайшего пути из в , значит, не существует никакого вообще никакого пути в следовательно по теореме Форда-Фалкерсона найденный поток максимальный.
Оценка быстродействия
Лемма: |
Если в сети с источником и стоком увеличение потока производится вдоль кратчайших путей в , то для всех вершин длина кратчайшего пути в остаточной сети не убывает после каждого увеличения потока. |
Доказательство: |
Предположим противное, пусть существует вершина , что после какого-то увеличения потока длина кратчайшего пути из в уменьшилась. Обозначим потоки до и после увеличения соответственно за и . Пусть — вершина, расстояние от до которой минимально и уменьшилось с увеличением потока. Имеем . Рассмотрим путь , являющийся кратчайшим от к в . Тогда верно, что .По выбору и из предыдущего утверждения получаем, что .Предположим Пусть , тогда . Это противоречит . , но известно, что . Появление ребра после увеличения потока означает увеличение потока по обратному ребру . Увеличение потока производится вдоль кратчайшего пути, поэтому кратчайший путь из в вдоль которого происходило увеличения выглядит как , из чего получаем . Данное утверждение противоречит . Итак мы пришли к противоречию с существованием вершины , кратчайшее расстояние до которой уменьшилось с увеличением потока. |
Опираясь на предшествующую лемму, докажем следующую теорему, которая ограничивает сверху число итераций цикла while в алгоритме Эдмондса-Карпа.
Теорема: |
Пусть для некоторой сети с источником и стоком выполняется алгоритм Эдмондса-Карпа, тогда общее число итераций цикла while составляет . |
Доказательство: |
Рассмотрим множество ребер остаточной сети , принадлежащих увеличивающему пути , таких что . Назовем данные ребра критическими. Покажем, что каждое из ребер может становиться критическим не более, чем раз. Заметим, что после увеличения потока вдоль пути все критические ребра исчезают из остаточной сети, кроме того по определению остаточной пропускной способности пути хотя бы одно ребро увеличивающего пути — критическое.Рассмотрим две вершины лемме , откуда . и принадлежащие , соединенные некоторым ребром из . Увеличение производится вдоль кратчайших путей, поэтому если ребро становиться критическим в первый раз, верно, что . После увеличения потока ребро исчезает из сети. Оно не появится в другом увеличивающем пути до тех, пор пока не будет уменьшен по обратному ребру . Это может произойти только в том случае, если ребро встретится на некотором увеличивающем пути. Пусть в момент перед увеличением поток в сети составлял , то поскольку увеличение производиться вдоль кратчайших путей, верно: . СогласноИтак в промежуток времени между тем, когда ребро Так как каждый увеличивающий путь содержит по крайней мере одно критическое ребро, следовательно число кратчайших путей составляет становится критическим в первый раз, до момента, когда оно становится критическим в следующий раз, расстояние от до увеличивается минимум на . Расстояние в начальный момент времени больше либо равно . Среди промежуточных вершин на кратчайшем пути не могут находиться , или . Следовательно к тому моменту, когда вершина станет недостижимой из источника расстояние до нее не превысит . Получаем, что ребро могло стать критическим не более раз. Поскольку в графе не более пар вершин, между которыми могут существовать ребра в остаточной сети, то общее количество критических ребер в ходе выполнения алгоритма Эдмондса-Карпа равно . . На каждой итерации цикла while рассматривается ровно один увеличивающий путь, а поскольку в случае отсутствия такого пути выполнение цикла прерывается, то число итераций цикла while также составляет . |
Если увеличивающий путь находить поиском в ширину, то каждую итерацию цикла while можно выполнить за время [1] на которой нижняя граница времени работы алгоритмы Эдмондса-Карпа также составляет .
. Инициализация в процедуре Edmonds_Karp производится за , следовательно время работы алгоритма алгоритма Эдмондса-Карпа составляет . Заметим также, что сущетсвует сеть "грибок"Примечания
Литература
- Кормен, Томас Х., Лейзерсон, Чарльз И., Ривест, Рональд Л., Штайн Клиффорд Алгоритмы: построение и анализ, 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — 1296 с.: ил. — Парал. тит. англ. — ISBN 978-5-8459-0857-5 (рус.)