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