Алгоритм масштабирования потока — различия между версиями
Строка 1: | Строка 1: | ||
== Алгоритм == | == Алгоритм == | ||
− | Пусть дана [[Определение_сети,_потока#.D0.9E.D0.BF.D1.80.D0.B5.D0.B4.D0.B5.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D1.81.D0.B5.D1.82.D0.B8|сеть]] <tex> G </tex>, все ребра которой имеют целочисленную пропускную способность. Обозначим за <tex> U </tex> максимальную пропускную способность: <tex> U = \max\limits_{(u, v) \in E} c(u, v), \Delta = 2^{\lfloor\log_2U\rfloor} | + | Пусть дана [[Определение_сети,_потока#.D0.9E.D0.BF.D1.80.D0.B5.D0.B4.D0.B5.D0.BB.D0.B5.D0.BD.D0.B8.D0.B5_.D1.81.D0.B5.D1.82.D0.B8|сеть]] <tex> G </tex>, все ребра которой имеют целочисленную пропускную способность. Обозначим за <tex> U </tex> максимальную пропускную способность: <tex> U = \max\limits_{(u, v) \in E} c(u, v), \Delta = 2^{\lfloor\log_2U\rfloor} </tex>. |
Идея алгоритма заключается в нахождении путей с высокой пропускной способностью в первую очередь, чтобы сразу сильно увеличивать поток по ним, а затем по всем остальным. | Идея алгоритма заключается в нахождении путей с высокой пропускной способностью в первую очередь, чтобы сразу сильно увеличивать поток по ним, а затем по всем остальным. | ||
Строка 17: | Строка 17: | ||
1 | 1 | ||
|statement= | |statement= | ||
− | Максимальный поток в сети <tex> G </tex> ограничен сверху значением <tex> |f_k| + 2^k | + | Максимальный поток в сети <tex> G </tex> ограничен сверху значением <tex> |f_k| + 2^k E </tex>, где <tex> |f_k| </tex> - значение потока |
|proof= | |proof= | ||
Строка 26: | Строка 26: | ||
2 | 2 | ||
|statement= | |statement= | ||
− | Количество увеличивающих путей на <tex> k </tex>-ом уровне не превосходит <tex> | + | Количество увеличивающих путей на <tex> k </tex>-ом уровне не превосходит <tex> 2E </tex> |
|proof= | |proof= | ||
Следует из предыдущей леммы. Каждый увеличивающий путь на <tex> k </tex>-ом уровне имеет пропускную способность не меньше <tex> 2^k </tex>. | Следует из предыдущей леммы. Каждый увеличивающий путь на <tex> k </tex>-ом уровне имеет пропускную способность не меньше <tex> 2^k </tex>. | ||
Строка 35: | Строка 35: | ||
3 | 3 | ||
|statement= | |statement= | ||
− | Количество увеличивающих путей не превышает <tex> O( | + | Количество увеличивающих путей не превышает <tex> O(E logU) </tex>. |
|proof= | |proof= | ||
Следует из предыдущей леммы и факта, что количество уровней {{---}} <tex> log_2U </tex>. | Следует из предыдущей леммы и факта, что количество уровней {{---}} <tex> log_2U </tex>. | ||
Строка 44: | Строка 44: | ||
== Псевдокод == | == Псевдокод == | ||
'''Max_Flow_By_Scaling(G,s,t)''' | '''Max_Flow_By_Scaling(G,s,t)''' | ||
− | <tex>f \leftarrow 0</tex> | + | <tex> f \leftarrow 0 </tex> |
− | <tex>\Delta \leftarrow 2^{\lfloor\log_2U\rfloor}</tex> | + | <tex> \Delta \leftarrow 2^{\lfloor\log_2U\rfloor} </tex> |
− | '''while''' <tex>\Delta \geq 1</tex> | + | '''while''' <tex> \Delta \geq 1 </tex> |
− | '''do while''' в <tex>G_f</tex> существует путь <tex> | + | '''do while''' в <tex> G_f </tex> существует увеличивающий путь <tex> p </tex> с пропускной способностью не меньшей <tex> \Delta </tex> |
− | '''do''' | + | '''do''' <tex> \delta \leftarrow \min\{c(u, v) \colon(u, v) \in p\} </tex> |
− | + | увеличить поток по рёбрам <tex> p </tex> на <tex> \delta </tex> | |
− | увеличить поток по рёбрам <tex> | + | обновить <tex> G_f </tex> |
− | обновить <tex>G_f</tex> | + | <tex> f \leftarrow f + \delta </tex> |
− | <tex>f \leftarrow f + \delta</tex> | + | <tex> \Delta \leftarrow \Delta / 2 </tex> |
− | <tex>\Delta \leftarrow \Delta / 2</tex> | + | '''return''' <tex> f </tex> |
− | '''return''' <tex>f</tex> | ||
== Литература == | == Литература == |
Версия 23:59, 28 февраля 2012
Содержание
Алгоритм
Пусть дана сеть , все ребра которой имеют целочисленную пропускную способность. Обозначим за максимальную пропускную способность: .
Идея алгоритма заключается в нахождении путей с высокой пропускной способностью в первую очередь, чтобы сразу сильно увеличивать поток по ним, а затем по всем остальным.
На каждой итерации найдем увеличивающие пути в дополняющей сети с пропускной способностью, не меньшей
, и увеличим поток вдоль них.Оценка времени работы
Утверждение: | ||||||||||||||
Время работы алгоритма — . | ||||||||||||||
Пусть — множество уровней.
| ||||||||||||||
Псевдокод
Max_Flow_By_Scaling(G,s,t)while do while в существует увеличивающий путь с пропускной способностью не меньшей do увеличить поток по рёбрам на обновить return