Изменения

Перейти к: навигация, поиск

Алгоритм масштабирования потока

829 байт убрано, 22:51, 14 января 2011
Нет описания правки
== Суть ==
Этот алгоритм работает в предположении, что все пропускные способности ребер целые. Пусть у нас есть граф <tex>G</tex>, <tex>\forall (u,v)\in E: \colon u_{(u,v)}\in\mathbb N</tex>. Пусть <tex>U</tex> - максимальная пропускная способность. Тогда запишем пропускную способность каждого ребра в двоичной записи, выделив для каждого ребра Введем параметр <tex>n:=\lfloor\log U\rfloor+1Delta</tex> памяти. Занумеруем биты с младшего (0-ой) по старший (n-ный). Тогда Это большое число, к примеру, равное <brtexU</tex>\forall (u,v)\in E:c(u,v)=2^n*a_n(u,v)+...+2*a_1(u,v)+a_0(u,v); a_i(u,v)\inНа каждом шаге будем искать в остаточном графе увеличивающие пути с пропускной способностью не меньше <tex>\{0,1\}Delta</tex> Будем решать задачу методом Форда-Фалкерсона сначала для графа с урезанными пропускными способностями и увеличивать поток вдоль этих путей. В конце шага будем уменьшать <tex>c_0(u,v):=a_n(u,v)\Delta</tex>. Решив ее в два раза, и получив поток на следующем шаге будем искать увеличивающий путь с новым <tex>f_0\Delta</tex>, добавим следующий бит и вычтем грубое приближение. То есть При <tex>\forall (u,v)\in E:c_1(u,v):Delta ==2*a_n(u,v)+a_{n-1}(u,v)-2*f_0(u,v)</tex>. Далее наше приближение становится точнее и точнееалгоритм масштабирования идентичен алгоритму Эдмондса - Карпа, пока не станет решением для исходной задачипоэтому алгоритм масштабирования корректен.
== Оценка сложности ==
На каждом шаге алгорит выполняет <tex>O(E)</tex> увеличений потока в худшем случае (т.к. минимальный разрез на каждом шаге меньше, чем <tex>2E\Delta</tex>). Дополняющий путь можно найти за <tex>O(E)</tex> используя BFS. Количество шагов <tex>O(log_2U)</tex>. Итоговая сложность <tex>O(E^2log_2U)</tex>.
Сложность этого алгоритма == Псевдокод == '''Capacity-Scaling''' <tex>O(E^2f\log U)leftarrow 0</tex>, где <tex>\log U</tex> - количество итераций. Докажем, что сложность каждой итерации <tex>O(EDelta\leftarrow 2^2){\lfloor\log_2U\rfloor}</tex>. На первой итерации мы имеем только ребра веса 1. Это значит, что '''while''' <tex>|f|\le VDelta>0</tex>. Значит количество итераций (дополняющих путей) не превосходит '''while''' в <tex>VG_f</tex>, поиск доп. пути занимает существует <tex>O(E)s-t</tex>. Получаем сложность путь найти путь <tex>O(VE)\le O(E^2)P</tex>. Теперь рассмотрим переход ко второй итерации. Граф <tex>G_\delta\leftarrow\min{r_{f_0ij}</tex> несвязен. Рассмотрим разрез <tex>\colon(Si,Tj)\in P}</tex>, где увеличить поток по ребрам <tex>SP</tex> и на <tex>T\delta</tex> - компоненты связности. <tex>(c_0)_{f_0}(S,T)=0</tex>. Значит в новом графе с пропускными способностями обновить <tex>c_1G_f</tex>: <tex>\forall uDelta\in S, vleftarrow\in T:c_1(u,v)\le1<Delta/tex>. Так как <tex>(S,T)2</tex> - разрез, то <tex>|f '''return'_1|=f'_1(S,T)\le c(S,T)\le E</tex>. Здесь <tex>f'_1</tex> - максимальный поток в <tex>G_1</tex> с пропускными способностями <tex>c_1</tex>, а <tex>f_1=f_0+f'_1</tex>. Так как пропускная способность каждого дополняющего пути не меньше 1, мы получили оценку на количество итераций. Дополняющий путь же мы можем найти за <tex>O(E)</tex>.
Анонимный участник

Навигация