Алгоритм поиска блокирующего потока в ациклической сети — различия между версиями
(→Идея) |
(→Идея) |
||
Строка 26: | Строка 26: | ||
MPM algorithm(s, t) | MPM algorithm(s, t) | ||
− | + | <tex>for each (uv) \in E</tex> | |
− | f(uv) = 0; | + | <tex>f(uv)</tex> = 0; |
− | Вычисляем остаточную сеть R; | + | Вычисляем остаточную сеть <tex>R</tex>; |
− | Найдём вспомогательный граф L для R; | + | Найдём вспомогательный граф <tex>L</tex> для <tex>R</tex>; |
− | while (t \in L) | + | <tex>while (t \in L)</tex> |
− | begin | + | <tex>begin</tex> |
− | while (t достижима из s в L) | + | <tex>while</tex> (<tex>t</tex> достижима из <tex>s</tex> в <tex>L</tex>) |
− | begin | + | <tex>begin</tex> |
− | найдём v с миниальной пропускной способностью g; | + | найдём <tex>v</tex> с миниальной пропускной способностью <tex>g</tex>; |
− | проталкиваем g единиц потока из v в t; | + | проталкиваем <tex>g</tex> единиц потока из <tex>v</tex> в <tex>t</tex>; |
− | проталкиваем g единиц потока из s в v; | + | проталкиваем <tex>g</tex> единиц потока из <tex>s</tex> в <tex>v</tex>; |
− | изменяем f, L и R; | + | изменяем <tex>f</tex>, <tex>L</tex> и <tex>R</tex>; |
− | end | + | <tex>end</tex> |
− | вычисляем новый вспомогательный граф L из R; | + | вычисляем новый вспомогательный граф <tex>L</tex> из <tex>R</tex>; |
− | end | + | <tex>end</tex> |
===Асимптотика=== | ===Асимптотика=== |
Версия 01:03, 25 декабря 2011
Содержание
Жадный Алгоритм
Идея
Идея заключается в том, чтобы по одному находить пути из
в , пока это возможно.Корректность
Данная идея корректна, поскольку
найдёт все пути из в , если из достижима , а пропускная способность каждого ребра поэтому, насыщая рёбра, мы хотя бы единожды достигнем стока , следовательно блокирующий поток всегда найдётся.Асимптотика
Используя
каждый путь находится за . Поскольку каждый путь насыщает как минимум одно ребро, всего будет путей. Итого общая асимптотика составляет .Удаляющий обход
Идея
По-прежнему по одному находятся пути из
в , но применяется следующая оптимизация: в процессе обхода в глубину удаляются все ребра, вдоль которых нельзя дойти до стока. То есть, если для текущей вершины выполнено , нужно удалить из графа эту вершину и все инцидентные ей ребра. С точки зрения реализации, надо просто поддерживать в списке смежности каждой вершины указатель на первое неудалённое ребро, и увеличивать этот указатель в цикле внутри обхода в глубину.Корректность
Аналогично предыдущему пункту.
Асимптотика
Если обход в глубину достигает стока, насыщается как минимум одно ребро, иначе как минимум один указатель продвигается вперед. Значит один запуск обхода в глубину работает за блокирующего потока будет , где — число рёбер, насыщенных этим блокирующим потоком, то весь алгоритм поиска блокирующего потока отработает за , что, учитывая, что все указатели в сумме прошли расстояние , дает асимптотику . В худшем случае, когда блокирующий поток насыщает все ребра, асимптотика получается .
, где - число продвижения указателей. Учитывая, что всего запусков обхода в глубину в рамках поиска одногоЗамечание Если в алгоритме Диница искать блокирующий поток удаляющим обходом, то его эффективность составит , что уже лучше эффективности алгоритма Эдмондса-Карпа .
Алгоритм узкого места
Идея
Для каждой вершины вводится потенциал потока, равный максимальному дополнительному потоку, который может пройти через эту вершину. Далее следует цикл. На каждой его итерации определяется вершина
с минимальным потенциалом . Затем пускается поток величины из истока в сток, проходящий через эту вершину. При этом если остаточная пропускная способность ребра равна нулю, то это ребро удаляется. Также, удаляются все вершины, у которых не остаётся ни одного входящего и/или ни одного выходящего ребра. При удалении вершины все смежные ребра удаляются.MPM algorithm(s, t)= 0; Вычисляем остаточную сеть ; Найдём вспомогательный граф для ; ( достижима из в ) найдём с миниальной пропускной способностью ; проталкиваем единиц потока из в ; проталкиваем единиц потока из в ; изменяем , и ; вычисляем новый вспомогательный граф из ;
Асимптотика
Если информация о входящих и исходящих дугах будет храниться в виде связных списков, то для того, чтобы пропустить поток, на каждой итерации будет выполнено
действий, где соответствует числу рёбер, для которых остаточная пропускная способность уменьшилась, но осталась положительной, а — числу удалённых ребер. Таким образом, для поиска блокирующего потока будет выполнено действий.Замечание Алгоритм Малхотры — Кумара — Махешвари для поиска блокирующего потока использует алгоритм узкого места.
Волновой алгоритм
Используя предпотоки, позволяет найти блокирующий поток за
. Модификация алгоритма Диница, основанная на этом алгоритме, называется алгоритмом Карзанова.