Алгоритм масштабирования потока — различия между версиями
Строка 1: | Строка 1: | ||
− | Алгоритм масштабирования потока — алгоритм поиска максимального потока | + | Алгоритм масштабирования потока — алгоритм поиска максимального потока путём регулирования пропускной способности рёбер. |
− | Этот алгоритм работает в предположении, что все пропускные способности | + | Этот алгоритм работает в предположении, что все пропускные способности рёбер целые. |
== Суть == | == Суть == | ||
Строка 7: | Строка 7: | ||
== Оценка сложности == | == Оценка сложности == | ||
[[Файл:Scaling.jpg|right]] | [[Файл:Scaling.jpg|right]] | ||
− | На каждом шаге алгоритм выполняет в худшем случае <tex>O(E)</tex> увеличений потока. Докажем это. Пусть <tex>\Delta = 2^k</tex>. В конце шага множество вершин графа можно разбить на две части: <tex>A_k</tex> и <tex>\overline{A_k}</tex>. Все рёбра, выходящие из <tex>A_k</tex>, имеют остаточную пропускную способность менее <tex>2^k</tex>. Наибольшее количество | + | На каждом шаге алгоритм выполняет в худшем случае <tex>O(E)</tex> увеличений потока. Докажем это. Пусть <tex>\Delta = 2^k</tex>. В конце шага множество вершин графа можно разбить на две части: <tex>A_k</tex> и <tex>\overline{A_k}</tex>. Все рёбра, выходящие из <tex>A_k</tex>, имеют остаточную пропускную способность менее <tex>2^k</tex>. Наибольшее количество рёбер между <tex>A_k</tex> и <tex>\overline{A_k}</tex> равно <tex>E</tex>. Следовательно, остаточный поток (поток, который может быть получен на оставшихся шагах) на фазе с текущим значением <tex>k</tex> максимально составляет <tex>2^kE</tex>. Каждый увеличивающий путь при данном <tex>k</tex> имеет пропускную способность как минимум <tex>2^k</tex>. На предыдущем шаге, с масштабом <tex>k+1</tex>, остаточный поток ограничен <tex>2^{k+1}E</tex>. Значит максимальное число появившихся увеличивающих путей равно <tex>2E</tex>. Увеличивающий путь можно найти за <tex>O(E)</tex>, используя [[Обход_в_ширину | BFS]]. Количество шагов <tex>O(\log_2U)</tex>. Итоговая сложность <tex>O(E^2\log_2U)</tex>. |
== Псевдокод == | == Псевдокод == |
Версия 08:26, 14 октября 2011
Алгоритм масштабирования потока — алгоритм поиска максимального потока путём регулирования пропускной способности рёбер. Этот алгоритм работает в предположении, что все пропускные способности рёбер целые.
Содержание
Суть
Пусть существует граф алгоритму Эдмондса — Карпа. Из этого следует, что алгоритм корректен.
и . Суть алгоритма в нахождении сперва путей с высокой пропускной способностью, чтобы сразу сильно увеличивать поток по этим путям, а затем по всем остальным. Пусть - максимальная пропускная способность. Введём параметр . На каждом шаге будем искать в остаточном графе увеличивающие пути с пропускной способностью не меньше, чем , и увеличивать поток вдоль этих путей. В конце шага будем уменьшать в два раза, и на следующем шаге будем искать увеличивающий путь с новым значением параметра. При значении , равном единице, данный алгоритм становится идентиченОценка сложности
На каждом шаге алгоритм выполняет в худшем случае BFS. Количество шагов . Итоговая сложность .
увеличений потока. Докажем это. Пусть . В конце шага множество вершин графа можно разбить на две части: и . Все рёбра, выходящие из , имеют остаточную пропускную способность менее . Наибольшее количество рёбер между и равно . Следовательно, остаточный поток (поток, который может быть получен на оставшихся шагах) на фазе с текущим значением максимально составляет . Каждый увеличивающий путь при данном имеет пропускную способность как минимум . На предыдущем шаге, с масштабом , остаточный поток ограничен . Значит максимальное число появившихся увеличивающих путей равно . Увеличивающий путь можно найти за , используяПсевдокод
Capacity-Scalingwhile do while в существует путь с пропускной способностью большей do путь с пропускной способностью большей увеличить поток по ребрам на обновить