Алгоритм масштабирования потока — различия между версиями
Строка 29: | Строка 29: | ||
* [http://www.csd.uwo.ca/~yuri/Papers/iccv07_cap_scaling.pdf ''Olivier Juan, Yuri Boikov'': Capacity Scaling for Graph Cuts in Vision] | * [http://www.csd.uwo.ca/~yuri/Papers/iccv07_cap_scaling.pdf ''Olivier Juan, Yuri Boikov'': Capacity Scaling for Graph Cuts in Vision] | ||
* [http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=maxFlowRevisited Algorithm Tutorials. Maximum Flow: Augmenting Path Algorithms Comparison] | * [http://www.topcoder.com/tc?module=Static&d1=tutorials&d2=maxFlowRevisited Algorithm Tutorials. Maximum Flow: Augmenting Path Algorithms Comparison] | ||
− | * [www.cs-seminar.spb.ru/reports/34.pdf ''Андрей Станкевич'': Задача о максимальном потоке] | + | * [http://www.cs-seminar.spb.ru/reports/34.pdf ''Андрей Станкевич'': Задача о максимальном потоке] |
Версия 22:25, 18 декабря 2011
Алгоритм масштабирования потока — алгоритм поиска максимального потока путём регулирования пропускной способности рёбер. Этот алгоритм работает в предположении, что все пропускные способности рёбер целые.
Содержание
Идея
Суть алгоритма в нахождении сперва путей с высокой пропускной способностью, чтобы сразу сильно увеличивать поток по этим путям, а затем по всем остальным. Пусть алгоритму Эдмондса — Карпа. Из этого следует, что алгоритм корректен.
- максимальная пропускная способность. Введём параметр . На каждом шаге будем искать в остаточном графе увеличивающие пути с пропускной способностью не меньше, чем , и увеличивать поток вдоль этих путей. В конце шага будем уменьшать в два раза, и на следующем шаге будем искать увеличивающий путь с новым значением параметра. При значении , равном единице, данный алгоритм становится идентиченПусть
— граф, — максимальная пропускная способность. Запишем пропускную способность каждого ребра в двоичном виде. Тогда каждое число будет занимать бит.
Оценка сложности
На каждом шаге алгоритм выполняет в худшем случае BFS. Количество шагов . Итоговая сложность .
увеличений потока. Докажем это. Пусть . В конце шага множество вершин графа можно разбить на две части: и . Все рёбра, выходящие из , имеют остаточную пропускную способность менее . Наибольшее количество рёбер между и равно . Следовательно, остаточный поток (поток, который может быть получен на оставшихся шагах) на фазе с текущим значением максимально составляет . Каждый увеличивающий путь при данном имеет пропускную способность как минимум . На предыдущем шаге, с масштабом , остаточный поток ограничен . Значит максимальное число появившихся увеличивающих путей равно . Увеличивающий путь можно найти за , используяПсевдокод
Capacity-Scalingwhile do while в существует путь с пропускной способностью большей do путь с пропускной способностью большей увеличить поток по рёбрам на обновить