Алгоритм масштабирования потока — различия между версиями
(→Алгоритм) |
|||
| Строка 45: | Строка 45: | ||
Оценка времени работы остальных итераций доказывается аналогично второму случаю. Количество итераций — <tex> O(\log U) </tex>. Значит, общее время работы алгоритма — <tex> O(E^2 \log U) </tex>. | Оценка времени работы остальных итераций доказывается аналогично второму случаю. Количество итераций — <tex> O(\log U) </tex>. Значит, общее время работы алгоритма — <tex> O(E^2 \log U) </tex>. | ||
}} | }} | ||
| + | |||
| + | == Псевдокод == | ||
| + | '''Max_Flow_By_Scaling(G,s,t)''' | ||
| + | <tex>f \leftarrow 0</tex> | ||
| + | <tex>\Delta \leftarrow 2^{\lfloor\log_2U\rfloor}</tex> | ||
| + | '''while''' <tex>\Delta \geq 1</tex> | ||
| + | '''do while''' в <tex>G_f</tex> существует путь <tex>s-t</tex> с пропускной способностью не меньшей <tex>\Delta</tex> | ||
| + | '''do''' <tex>P\leftarrow</tex> путь с пропускной способностью не меньшей <tex>\Delta</tex> | ||
| + | <tex>\delta \leftarrow \min\{c_{ij}\colon(i,j)\in P\}</tex> | ||
| + | увеличить поток по рёбрам <tex>P</tex> на <tex>\delta</tex> | ||
| + | обновить <tex>G_f</tex> | ||
| + | <tex>f \leftarrow f + \delta</tex> | ||
| + | <tex>\Delta \leftarrow \Delta / 2</tex> | ||
| + | '''return''' <tex>f</tex> | ||
== Литература == | == Литература == | ||
Версия 22:44, 28 февраля 2012
Содержание
Алгоритм
Пусть дана сеть , все ребра которой имеют целочисленную пропускную способность. Обозначим за максимальную пропускную способность: .
Идея алгоритма заключается в нахождении путей с высокой пропускной способностью в первую очередь, чтобы сразу сильно увеличивать поток по ним, а затем по всем остальным.
Если записать пропускную способность любого ребра в двоичном виде, то длина полученной битовой последовательности не будет превышать бит, а значение пропускной способности определяется формулой: .
Методом Форда-Фалкерсона находим поток для сети с урезанными пропускными способностями . Добавим следующий бит и находим следующее приближение для графа с новыми пропускными способностями .
После итерации получим ответ к задаче, так как .
Оценка времени работы
| Утверждение: | ||||||||||||
Время работы алгоритма — . | ||||||||||||
|
Докажем, что время работы каждой итерации — .
| ||||||||||||
Псевдокод
Max_Flow_By_Scaling(G,s,t)
while
do while в существует путь с пропускной способностью не меньшей
do путь с пропускной способностью не меньшей
увеличить поток по рёбрам на
обновить
return