Алгоритм масштабирования потока — различия между версиями
(→Суть) |
(→Оценка сложности) |
||
Строка 6: | Строка 6: | ||
== Оценка сложности == | == Оценка сложности == | ||
− | На каждом шаге алгоритм выполняет <tex>O(E)</tex> увеличений потока в худшем случае | + | На каждом шаге алгоритм выполняет <tex>O(E)</tex> увеличений потока в худшем случае. Докажем это. <tex>\Delta = 2^k</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^2log_2U)</tex>. |
== Псевдокод == | == Псевдокод == |
Версия 20:40, 15 января 2011
Алгоритм масштабирования потока - алгоритм поиска максимального потока путем регулирования пропускной способности ребер.
Суть
Этот алгоритм работает в предположении, что все пропускные способности ребер целые. Пусть есть граф алгоритму Эдмондса - Карпа, поэтому алгоритм масштабирования корректен.
, . Суть алгоритма в нахождении сначала путей с высокой пропускной способностью, чтобы сразу сильно увеличивать поток. Пусть - максимальная пропускная способность. Введем параметр . Это большое число, к примеру, равное . На каждом шаге будем искать в остаточном графе увеличивающие пути с пропускной способностью не меньше и увеличивать поток вдоль этих путей. В конце шага будем уменьшать в два раза, и на следующем шаге будем искать увеличивающий путь с новым . При алгоритм масштабирования идентиченОценка сложности
На каждом шаге алгоритм выполняет BFS. Количество шагов . Итоговая сложность .
увеличений потока в худшем случае. Докажем это. . Каждый увеличивающий путь при данном имеет пропускную способность как минимум . На предыдущем шаге с масштабом поток был ограничен . Значит максимальное число появившихся увеличивающих путей равно . Дополняющий путь можно найти за , используяПсевдокод
Capacity-Scalingwhile while в существует путь с пропускной способностью большей путь с пропускной способностью большей увеличить поток по ребрам на обновить return f