Алгоритм масштабирования потока — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Алгоритм)
(Оценка времени работы)
Строка 37: Строка 37:
 
[[Файл: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> s </tex> — [[Определение_сети,_потока#.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> t </tex> — [[Определение_сети,_потока#.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> s </tex> — [[Определение_сети,_потока#.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> t </tex> — [[Определение_сети,_потока#.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_{f_0} </tex>]] — [[Отношение_связности,_компоненты_связности#.D0.A1.D0.BB.D1.83.D1.87.D0.B0.D0.B9_.D0.BE.D1.80.D0.B8.D0.B5.D0.BD.D1.82.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.BD.D0.BE.D0.B3.D0.BE_.D0.B3.D1.80.D0.B0.D1.84.D0.B0|несвязна]]. Обозначим за <tex> A </tex> компоненту связности графа, содержащую вершину <tex> s </tex>. Тогда <tex> t \notin A </tex>. Источник и сток лежат в разных компонентах связности, значит <tex> c_{0_{f_0}}(A, \overline{A}) = c_0(A, \overline{A}) - f_0(A, \overline{A}) = 0 </tex>.
+
[[Дополняющая_сеть,_дополняющий_путь|Дополняющая сеть]] <tex> G_{f_0} </tex> — [[Отношение_связности,_компоненты_связности#.D0.A1.D0.BB.D1.83.D1.87.D0.B0.D0.B9_.D0.BE.D1.80.D0.B8.D0.B5.D0.BD.D1.82.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.BD.D0.BE.D0.B3.D0.BE_.D0.B3.D1.80.D0.B0.D1.84.D0.B0|несвязна]]. Обозначим за <tex> A </tex> компоненту связности графа, содержащую вершину <tex> s </tex>. Тогда <tex> t \notin A </tex>. Источник и сток лежат в разных компонентах связности, значит <tex> c_{0_{f_0}}(A, \overline{A}) = c_0(A, \overline{A}) - f_0(A, \overline{A}) = 0 </tex>.
  
Следовательно, в графе с пропускными способностями <tex> c_1 </tex>:
+
Следовательно, в сети <tex> G_1 </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> f'_1 </tex> в графе <tex> G_1 </tex>.
+
Рассмотрим максимальный поток <tex> f'_1 </tex> в сети <tex> G_1 </tex>.
 
<tex> \langle A, \overline{A} \rangle </tex> — [[Разрез,_лемма_о_потоке_через_разрез|разрез]], значит:
 
<tex> \langle A, \overline{A} \rangle </tex> — [[Разрез,_лемма_о_потоке_через_разрез|разрез]], значит:
 
<tex> |f'_1| = f'_1(A, \overline{A}) \leq c(A, \overline{A}) \leq E, f_1 = f_0 + f'_1 </tex>.
 
<tex> |f'_1| = f'_1(A, \overline{A}) \leq c(A, \overline{A}) \leq E, f_1 = f_0 + f'_1 </tex>.

Версия 04:15, 26 декабря 2011

Определение:
Алгоритм масштабирования потока — алгоритм поиска максимального потока, работающий в предположении, что все пропускные способности рёбер целые, так как они легко представимы в двоичном виде.


Алгоритм

Пусть дана сеть [math] G [/math], все ребра которой имеют целочисленную пропускную способность. Обозначим за [math] U [/math] максимальную пропускную способность: [math] U = \max\limits_{(u, v) \in EG} c(u, v) [/math].

Если записать пропускную способность любого ребра в двоичном виде, то длина полученной битовой последовательности не будет превышать [math] \lfloor \log_2 U \rfloor + 1 = n + 1 [/math] бит, а значение пропускной способности определяется формулой: [math] c(u, v) = \sum\limits_{i = 0}^n a_i(u, v) \times 2^n, a_i(u, v) \in \{0, 1\} [/math].

Идея алгоритма заключается в нахождении путей с высокой пропускной способностью в первую очередь, чтобы сразу сильно увеличивать поток по ним, а затем по всем остальным.

Методом Форда-Фалкерсона находим поток [math] f_0 [/math] для сети [math] G_0 [/math] с урезанными пропускными способностями [math] c_0(u, v) = a_n(u, v) [/math]. Добавим следующий бит и находим следующее приближение для графа [math] G_1 [/math] с новыми пропускными способностями [math] c_1(u, v) = 2 a_n(u, v) + a_{n - 1}(u, v) - 2 f_0(u, v) [/math].

После [math] n + 1 [/math] итерации получим ответ к задаче.

Оценка времени работы

Утверждение:
Время работы алгоритма — [math] O(E^2 \log U) [/math].
[math]\triangleright[/math]

Докажем, что время работы каждой итерации — [math] O(E^2) [/math].

Лемма:
Время работы первой итерации алгоритма — [math] O(E^2) [/math].
Доказательство:
[math]\triangleright[/math]
На первом шаге ребра имеют пропускную способность [math] 1 [/math]. Значит, [math] |f_0| \leq V [/math]. Поиск каждого дополнительного пути требует [math] O(E) [/math] времени, а их количество не больше [math] V [/math]. Итоговое время работы первой итерации — [math] O(VE) \leq O(E^2) [/math].
[math]\triangleleft[/math]
Лемма:
Время работы второй итерации алгоритма — [math] O(E^2) [/math].
Доказательство:
[math]\triangleright[/math]
Разрез [math] \langle A, \overline{A} \rangle [/math].

Пусть вершина [math] s [/math]источник графа, вершина [math] t [/math]сток. Дополняющая сеть [math] G_{f_0} [/math]несвязна. Обозначим за [math] A [/math] компоненту связности графа, содержащую вершину [math] s [/math]. Тогда [math] t \notin A [/math]. Источник и сток лежат в разных компонентах связности, значит [math] c_{0_{f_0}}(A, \overline{A}) = c_0(A, \overline{A}) - f_0(A, \overline{A}) = 0 [/math].

Следовательно, в сети [math] G_1 [/math] с пропускными способностями [math] c_1 [/math]: [math] \forall u \in A, v \in \overline{A} \colon c_1(u, v) \leq 1 [/math].

Рассмотрим максимальный поток [math] f'_1 [/math] в сети [math] G_1 [/math]. [math] \langle A, \overline{A} \rangle [/math]разрез, значит: [math] |f'_1| = f'_1(A, \overline{A}) \leq c(A, \overline{A}) \leq E, f_1 = f_0 + f'_1 [/math].

Пропускная способность каждого дополняющего пути не меньше [math] 1 [/math], а поиск каждого занимает [math] O(E) [/math] времени. Значит, итоговое время работы — [math] O(E^2) [/math].
[math]\triangleleft[/math]
Оценка времени работы остальных итераций доказывается аналогично второму случаю. Количество итераций — [math] O(\log U) [/math]. Значит, общее время работы алгоритма — [math] O(E^2 \log U) [/math].
[math]\triangleleft[/math]

Литература