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

Материал из Викиконспекты
Перейти к: навигация, поиск
(Суть)
(Псевдокод)
Строка 13: Строка 13:
 
     <tex>\Delta\leftarrow 2^{\lfloor\log_2U\rfloor}</tex>
 
     <tex>\Delta\leftarrow 2^{\lfloor\log_2U\rfloor}</tex>
 
     '''while''' <tex>\Delta>0</tex>
 
     '''while''' <tex>\Delta>0</tex>
         '''while''' в <tex>G_f</tex> существует <tex>s-t</tex> путь
+
         '''while''' в <tex>G_f</tex> существует <tex>s-t</tex> путь с пропускной способностью большей <tex>\Delta</tex>
             найти путь <tex>P</tex>
+
             <tex>P\leftarrow</tex> путь с пропускной способностью большей <tex>\Delta</tex>
             <tex>\delta\leftarrow\min{r_{ij}\colon(i,j)\in P}</tex>
+
             <tex>\delta\leftarrow\min\{c_{ij}\colon(i,j)\in P\}</tex>
 
             увеличить поток по ребрам <tex>P</tex> на <tex>\delta</tex>
 
             увеличить поток по ребрам <tex>P</tex> на <tex>\delta</tex>
 
             обновить <tex>G_f</tex>
 
             обновить <tex>G_f</tex>

Версия 20:22, 15 января 2011

Алгоритм масштабирования потока - алгоритм поиска максимального потока путем регулирования пропускной способности ребер.

Суть

Этот алгоритм работает в предположении, что все пропускные способности ребер целые. Пусть есть граф [math]G[/math], [math]\forall (u,v)\in E\colon u_{(u,v)}\in\mathbb N[/math]. Пусть [math]U[/math] - максимальная пропускная способность. Введем параметр [math]\Delta[/math]. Это большое число, к примеру, равное [math]U[/math]. На каждом шаге будем искать в остаточном графе увеличивающие пути с пропускной способностью не меньше [math]\Delta[/math] и увеличивать поток вдоль этих путей. В конце шага будем уменьшать [math]\Delta[/math] в два раза, и на следующем шаге будем искать увеличивающий путь с новым [math]\Delta[/math]. При [math]\Delta == 1[/math] алгоритм масштабирования идентичен алгоритму Эдмондса - Карпа, поэтому алгоритм масштабирования корректен.

Оценка сложности

На каждом шаге алгоритм выполняет [math]O(E)[/math] увеличений потока в худшем случае (т.к. минимальный разрез на каждом шаге меньше, чем [math]2E\Delta[/math]). Дополняющий путь можно найти за [math]O(E)[/math] используя BFS. Количество шагов [math]O(log_2U)[/math]. Итоговая сложность [math]O(E^2log_2U)[/math].

Псевдокод

Capacity-Scaling
    [math]f\leftarrow 0[/math]
    [math]\Delta\leftarrow 2^{\lfloor\log_2U\rfloor}[/math]
    while [math]\Delta\gt 0[/math]
        while в [math]G_f[/math] существует [math]s-t[/math] путь с пропускной способностью большей [math]\Delta[/math]
           [math]P\leftarrow[/math] путь с пропускной способностью большей [math]\Delta[/math]
           [math]\delta\leftarrow\min\{c_{ij}\colon(i,j)\in P\}[/math]
           увеличить поток по ребрам [math]P[/math] на [math]\delta[/math]
           обновить [math]G_f[/math]
           [math]f\leftarrow f+\delta[/math]
    [math]\Delta\leftarrow\Delta/2[/math]
return f