Алгоритм масштабирования потока — различия между версиями
(→Оценка сложности) |
(→Оценка сложности) |
||
| Строка 21: | Строка 21: | ||
{{Утверждение | {{Утверждение | ||
|statement= | |statement= | ||
| − | + | Сложность алгоритма — <tex> O(E^2 \log U) </tex>. | |
|proof= | |proof= | ||
| − | + | Докажем, что сложность каждой итерации — <tex> O(E^2) </tex>. | |
| − | На первом шаге ребра имеют пропускную способность <tex> 1 </tex>. Значит, <tex> |f_0| \leq | + | {{Лемма |
| + | |statement= | ||
| + | Сложность первой итерации алгоритма — <tex> O(E^2) </tex>. | ||
| + | |proof= | ||
| + | На первом шаге ребра имеют пропускную способность <tex> 1 </tex>. Значит, <tex> |f_0| \leq V </tex>. Поиск каждого дополнительного пути требует <tex> O(E) </tex> времени, а их количество не больше <tex> V </tex>. Итоговая сложность первой итерации — <tex> O(VE) \leq O(E^2) </tex>, q.e.d. | ||
| + | }} | ||
| + | {{Лемма | ||
| + | |statement= | ||
| + | Сложность второй итерации алгоритма — <tex> O(E^2) </tex>. | ||
| + | |proof= | ||
[[Файл:Scaling.jpg|250px|thumb|right|Разрез <tex> \langle A, \overline{A} \rangle </tex>.]] | [[Файл:Scaling.jpg|250px|thumb|right|Разрез <tex> \langle A, \overline{A} \rangle </tex>.]] | ||
Докажем оценку для второго шага (для остальных доказательство аналогично). | Докажем оценку для второго шага (для остальных доказательство аналогично). | ||
| − | Граф <tex> G_{f_0} </tex> — несвязен. Пусть <tex> A </tex> — компонента связности, <tex> s \in A, t \in \overline{A} </tex>. Тогда <tex> c_{0_{f_0}}(A, \overline{A}) = 0 </tex>. Значит, в графе с пропускными способностями <tex> c_1 </tex>: | + | Граф <tex> G_{f_0} </tex> — несвязен. Пусть <tex> A </tex> — компонента связности, <tex> s \in A, t \in \overline{A} </tex>. Тогда <tex> c_{0_{f_0}}(A, \overline{A}) = 0 </tex>. |
| + | |||
| + | Значит, в графе с пропускными способностями <tex> c_1 </tex>: | ||
<tex> \forall u \in A, v \in \overline{A} \colon c_1(u, v) \leq 1 </tex>. | <tex> \forall u \in A, v \in \overline{A} \colon c_1(u, v) \leq 1 </tex>. | ||
| − | <tex> \langle A, \overline{A} \rangle </tex> — разрез, | + | <tex> \langle A, \overline{A} \rangle </tex> — разрез. Рассмотрим максимальный поток <tex> f'_1 </tex> в графе <tex> G_1 </tex>: |
| + | <tex> |f'_1| = f'_1(A, \overline{A}) \leq c(A, \overline{A}) \leq E </tex>. | ||
| + | }} | ||
| + | |||
| + | Оценка сложности остальных итераций доказывается аналогично второму случаю. Количество итераций — <tex> O(\log U) </tex>. Значит, общая сложность алгоритма — <tex> O(E^2 \log U) </tex>. | ||
}} | }} | ||
Версия 07:13, 19 декабря 2011
| Определение: |
| Алгоритм масштабирования потока — алгоритм поиска максимального потока путём регулирования пропускной способности рёбер. Этот алгоритм работает в предположении, что все пропускные способности рёбер целые, так как они легко представимы в двоичном виде. |
Содержание
Идея
Идея алгоритма в нахождении путей с высокой пропускной способностью в первую очередь, чтобы сразу сильно увеличивать поток по ним, а затем по всем остальным.
Пусть дан граф с целыми пропускными способностями: . — максимальная пропускная способность. Запишем пропускную способность каждого ребра в двоичном виде. Тогда каждое число будет занимать бит.
Методом Форда-Фалкерсона находим поток для графа с урезанными пропускными способностями . Добавим следующий бит и находим следующее приближение для графа с новыми пропускными способностями .
После итерации получим ответ к задаче.
Оценка сложности
| Утверждение: | ||||||||||||
Сложность алгоритма — . | ||||||||||||
|
Докажем, что сложность каждой итерации — .
| ||||||||||||
Псевдокод
Capacity-Scaling
while
do while в существует путь с пропускной способностью большей
do путь с пропускной способностью большей
увеличить поток по рёбрам на
обновить