Алгоритм Эдмондса-Карпа — различия между версиями
(→Алгоритм) |
(→Псевдокод) |
||
Строка 20: | Строка 20: | ||
'''Edmonds_Karp''' (G, s, t) | '''Edmonds_Karp''' (G, s, t) | ||
'''for''' (для) каждого ребра <tex>(u,v) \in E[G]</tex> | '''for''' (для) каждого ребра <tex>(u,v) \in E[G]</tex> | ||
− | + | <tex>f[u,v] \leftarrow 0</tex> | |
− | + | <tex>f[v,u] \leftarrow 0</tex> | |
'''while''' существует ''кратчайший'' путь <tex>p</tex> из <tex>s</tex> в <tex>t</tex> в остаточной сети <tex>G_f</tex> | '''while''' существует ''кратчайший'' путь <tex>p</tex> из <tex>s</tex> в <tex>t</tex> в остаточной сети <tex>G_f</tex> | ||
− | + | <tex>c_f(p) \leftarrow min\{c_f(u,v) : (u,v) \in p\}</tex> | |
− | + | '''for''' <tex>(u,v) \in p</tex> | |
− | + | <tex>f[u,v] \leftarrow f[u,v] + c_f(p)</tex> | |
− | + | <tex>f[v,u] \leftarrow -f[u,v]</tex> | |
== Корректность алгоритма Эдмондса-Карпа == | == Корректность алгоритма Эдмондса-Карпа == |
Версия 13:38, 13 декабря 2015
Содержание
Алгоритм
Алгоритм Эдмондса-Карпа является реализацией метода Форда-Фалкерсона, в которой в качестве дополняющего пути выбирается кратчайший по ребрам путь в остаточной сети (длины всех ребер равны
).Описание
- Положим все потоки равными нулю. Остаточная сеть изначально совпадает с исходной сетью.
- В остаточной сети находим кратчайший путь из источника в сток. Если такого пути нет, останавливаемся.
- Пускаем через найденный путь (он называется увеличивающим путём или увеличивающей цепью) максимально возможный поток:
- На найденном пути в остаточной сети ищем ребро с минимальной пропускной способностью .
- Для каждого ребра на найденном пути увеличиваем поток на , а в противоположном ему — уменьшаем на .
- Модифицируем остаточную сеть. Для всех рёбер на найденном пути, а также для противоположных им рёбер, вычисляем новую пропускную способность. Если она стала ненулевой, добавляем ребро к остаточной сети, а если обнулилась, стираем его.
- Возвращаемся на шаг 2.
Сложность
Сложность алгоритма Эдмондса-Карпа равна
.Псевдокод
Edmonds_Karp (G, s, t) for (для) каждого ребраwhile существует кратчайший путь из в в остаточной сети for
Корректность алгоритма Эдмондса-Карпа
Алгоритм Эдмондса-Карпа является реализацией метода Форда-Фалкерсона. На каждой итерации цикла поток в графе увеличивается вдоль одного из кратчайших путей в из истока в сток . Этот процесс повторяется до тех пор пока существует кратчайший путь в . Если в не существует кратчайшего пути из в , значит, не существует никакого вообще никакого пути в следовательно по теореме Форда-Фалкерсона найденный поток максимальный.
Оценка быстродействия
Лемма: |
Если в сети с источником и стоком увеличение потока производится вдоль кратчайших путей в , то для всех вершин длина кратчайшего пути в остаточной сети не убывает после каждого увеличения потока. |
Доказательство: |
Предположим противное, пусть существует вершина , что после какого-то увеличения потока длина кратчайшего пути из в уменьшилась. Обозначим потоки до и после увеличения соответственно за и . Пусть — вершина, расстояние от до которой минимально и уменьшилось с увеличением потока. Имеем . Рассмотрим путь , являющийся кратчайшим от к в . Тогда верно, что .По выбору и из предыдущего утверждения получаем, что .Предположим Пусть , тогда . Это противоречит . , но известно, что . Появление ребра после увеличения потока означает увеличение потока по обратному ребру . Увеличение потока производится вдоль кратчайшего пути, поэтому кратчайший путь из в вдоль которого происходило увеличения выглядит как , из чего получаем . Данное утверждение противоречит . Итак мы пришли к противоречию с существованием вершины , кратчайшее расстояние до которой уменьшилось с увеличением потока. |
Опираясь на предшествующую лемму, докажем следующую теорему, которая ограничивает сверху число итераций цикла в алгоритме Эдмондса-Карпа.
Теорема: |
Пусть для некоторой сети с источником и стоком выполняется алгоритм Эдмондса-Карпа, тогда общее число итераций цикла составляет . |
Доказательство: |
Рассмотрим множество ребер остаточной сети , принадлежащих увеличивающему пути , таких что . Назовем данные ребра критическими. Покажем, что каждое из ребер может становиться критическим не более, чем раз. Заметим, что после увеличения потока вдоль пути все критические ребра исчезают из остаточной сети, кроме того по определению остаточной пропускной способности пути хотя бы одно ребро увеличивающего пути — критическое.Рассмотрим две вершины лемме , откуда . и принадлежащие , соединенные некоторым ребром из . Увеличение производится вдоль кратчайших путей, поэтому если ребро становиться критическим в первый раз, верно, что . После увеличения потока ребро исчезает из сети. Оно не появится в другом увеличивающем пути до тех, пор пока не будет уменьшен по обратному ребру . Это может произойти только в том случае, если ребро встретится на некотором увеличивающем пути. Пусть в момент перед увеличением поток в сети составлял , то поскольку увеличение производиться вдоль кратчайших путей, верно: . СогласноИтак в промежуток времени между тем, когда ребро Так как каждый увеличивающий путь содержит по крайней мере одно критическое ребро, следовательно число кратчайших путей составляет становится критическим в первый раз, до момента, когда оно становится критическим в следующий раз, расстояние от до увеличивается минимум на . Расстояние в начальный момент времени больше либо равно . Среди промежуточных вершин на кратчайшем пути не могут находиться , или . Следовательно к тому моменту, когда вершина станет недостижимой из источника расстояние до нее не превысит . Получаем, что ребро могло стать критическим не более раз. Поскольку в графе не более пар вершин, между которыми могут существовать ребра в остаточной сети, то общее количество критических ребер в ходе выполнения алгоритма Эдмондса-Карпа равно . . На каждой итерации цикла рассматривается ровно один увеличивающий путь, а поскольку в случае отсутствия такого пути выполнение цикла прерывается, то число итераций цикла также составляет . |
Если увеличивающий путь находить поиском в ширину, то каждую итерацию цикла [1] на которой нижняя граница времени работы алгоритмы Эдмондса-Карпа также составляет .
можно выполнить за время . Инициализация в процедуре Edmonds_Karp производится за , следовательно время работы алгоритма алгоритма Эдмондса-Карпа составляет . Заметим также, что сущетсвует сеть "грибок"Примечания
Источники информации
- Кормен, Томас Х., Лейзерсон, Чарльз И., Ривест, Рональд Л., Штайн Клиффорд Алгоритмы: построение и анализ, 2-е издание. Пер. с англ. — М.:Издательский дом "Вильямс", 2010. — 1296 с.: ил. — Парал. тит. англ. — ISBN 978-5-8459-0857-5 (рус.)
- Википедия: Алоритм Эдмондса-Карпа
- Википедия: Алоритм Эдмондса-Карпа (англ.)