Алгоритм масштабирования потока — различия между версиями
(→Суть) |
|||
Строка 3: | Строка 3: | ||
== Суть == | == Суть == | ||
− | Этот алгоритм работает в предположении, что все пропускные способности ребер целые. Пусть | + | Этот алгоритм работает в предположении, что все пропускные способности ребер целые. Пусть есть граф <tex>G</tex>, <tex>\forall (u,v)\in E\colon u_{(u,v)}\in\mathbb N</tex>. Пусть <tex>U</tex> - максимальная пропускная способность. Введем параметр <tex>\Delta</tex>. Это большое число, к примеру, равное <tex>U</tex>. На каждом шаге будем искать в остаточном графе увеличивающие пути с пропускной способностью не меньше <tex>\Delta</tex> и увеличивать поток вдоль этих путей. В конце шага будем уменьшать <tex>\Delta</tex> в два раза, и на следующем шаге будем искать увеличивающий путь с новым <tex>\Delta</tex>. При <tex>\Delta == 1</tex> алгоритм масштабирования идентичен алгоритму Эдмондса - Карпа, поэтому алгоритм масштабирования корректен. |
− | |||
− | <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>f\leftarrow 0</tex> | |
− | + | <tex>\Delta\leftarrow 2^{\lfloor\log_2U\rfloor}</tex> | |
− | + | '''while''' <tex>\Delta>0</tex> | |
+ | '''while''' в <tex>G_f</tex> существует <tex>s-t</tex> путь | ||
+ | найти путь <tex>P</tex> | ||
+ | <tex>\delta\leftarrow\min{r_{ij}\colon(i,j)\in P}</tex> | ||
+ | увеличить поток по ребрам <tex>P</tex> на <tex>\delta</tex> | ||
+ | обновить <tex>G_f</tex> | ||
+ | <tex>\Delta\leftarrow\Delta/2</tex> | ||
+ | '''return''' f |
Версия 22:51, 14 января 2011
Алгоритм масштабирования потока - алгоритм поиска максимального потока путем регулирования пропускной способности ребер.
Суть
Этот алгоритм работает в предположении, что все пропускные способности ребер целые. Пусть есть граф
, . Пусть - максимальная пропускная способность. Введем параметр . Это большое число, к примеру, равное . На каждом шаге будем искать в остаточном графе увеличивающие пути с пропускной способностью не меньше и увеличивать поток вдоль этих путей. В конце шага будем уменьшать в два раза, и на следующем шаге будем искать увеличивающий путь с новым . При алгоритм масштабирования идентичен алгоритму Эдмондса - Карпа, поэтому алгоритм масштабирования корректен.Оценка сложности
На каждом шаге алгорит выполняет
увеличений потока в худшем случае (т.к. минимальный разрез на каждом шаге меньше, чем ). Дополняющий путь можно найти за используя BFS. Количество шагов . Итоговая сложность .Псевдокод
Capacity-Scalingwhile while в существует путь найти путь увеличить поток по ребрам на обновить return f