Метод проталкивания предпотока — различия между версиями
Warrior (обсуждение | вклад) (→Проталкивание (Push)) |
Warrior (обсуждение | вклад) (→Проталкивание (Push)) |
||
Строка 38: | Строка 38: | ||
Данная операция работает следующим образом: по ребру <tex> (u, v) </tex> пропускается максимально возможный поток, то есть минимум из избытка вершины <tex> u </tex> и остаточной пропускной способности ребра <tex> (u, v) </tex>, вследствие чего избыток вершины <tex> u </tex>, остаточная пропускная способность ребра <tex> (u, v) </tex> и поток по обратному ребру <tex> (v, u) </tex> уменьшается на величину потока, а избыток вершины <tex> v </tex>, поток по ребру <tex> (u, v) </tex> и остаточная пропускная способность обратного ребра <tex> (v, u) </tex> увеличивается на эту же величину. | Данная операция работает следующим образом: по ребру <tex> (u, v) </tex> пропускается максимально возможный поток, то есть минимум из избытка вершины <tex> u </tex> и остаточной пропускной способности ребра <tex> (u, v) </tex>, вследствие чего избыток вершины <tex> u </tex>, остаточная пропускная способность ребра <tex> (u, v) </tex> и поток по обратному ребру <tex> (v, u) </tex> уменьшается на величину потока, а избыток вершины <tex> v </tex>, поток по ребру <tex> (u, v) </tex> и остаточная пропускная способность обратного ребра <tex> (v, u) </tex> увеличивается на эту же величину. | ||
+ | |||
+ | <pre> | ||
+ | Push(u, v) | ||
+ | d = min(e(u), c(u, v) - f(u, v)); | ||
+ | f(u, v) += d; | ||
+ | f(v, u) = -f(u, v); | ||
+ | e(u) -= d; | ||
+ | e(v) += d; | ||
+ | </pre> | ||
=== Подъем (Relabel) === | === Подъем (Relabel) === |
Версия 17:32, 7 декабря 2012
Метод проталкивая предпотока — обобщенный алгоритм нахождения максимального потока в транспортной сети. В отличии от алгоритма Эдмондса-Карпа и алгоритма Диница не является частным случаем метода Форда-Фалкерсона.
Содержание
Определения
Определение: |
Предпотоком (preflow) будем называть функцию 1) (антисимметричность)2) 3) (ограничение пропускной способностью) (ослабленное условие сохранения потока) | , удовлетворяющую следующим свойствам:
Как можно заметить, по своим свойствам предпоток очень похож на поток и отличается лишь тем, что для него не выполняется закон сохранения потока.
Определение: |
Избыточным потоком (excess flow), входящим в вершину Тогда вершина будет называться переполненной (overflowing), если . | , назовем величину .
Определение: |
Функция 1) 2) 3) | называется высотой вершины (vertex label), если она удовлетворяет условиям:
Идея
Для понимания идеи алгоритма представим, что наша сеть — система из резервуаров, находящихся на определенной высоте, и соединяющих их труб с заданными пропускными способностями, соответствующих вершинам и ребрам в исходной сети. Сам алгоритм можно представить как процесс поочередного "переливания" жидкости (операция проталкивания) из одного резервуара в другие, находящиеся на меньшей высоте, до тех пор пока будет существовать резервуар, соответствующей переполненной вершине. Может случиться ситуация, что все трубы, выходящие из переполненной вершины
, ведут к вершинам, находящимся на такой же высоте что и или выше ее. В таком случае поднимем резервуар (операция подъема), соответствующий данной вершине, таким образом, чтобы его высота стала на единицу больше, чем высота самого низкого из смежных резервуаров. После подъема будет существовать по крайней мере одна труба, по которой можно попустить жидкость.В итоге, у нас не останется ни одной переполненной вершины, та часть потока, которая могла пройти к стоку, окажется там, остальная же вернется в сток. В такой ситуации предпоток превращается в обычный поток, так как для каждой вершины выполняется условие сохранения потока. Как будет показано далее, предпоток становится не только обычным, но и максимальным потоком.
Операции
Как упоминалось ранее, в алгоритме выполняются две основные операции: проталкивание из переполненной вершины избытка потока в смежные вершины, высота которых меньше, чем у переполненной, и подъем вершины.
Проталкивание (Push)
Операция проталкивания из вершины
в вершину может применяться тогда, когда , то есть вершина является переполненной, и .Данная операция работает следующим образом: по ребру
пропускается максимально возможный поток, то есть минимум из избытка вершины и остаточной пропускной способности ребра , вследствие чего избыток вершины , остаточная пропускная способность ребра и поток по обратному ребру уменьшается на величину потока, а избыток вершины , поток по ребру и остаточная пропускная способность обратного ребра увеличивается на эту же величину.Push(u, v) d = min(e(u), c(u, v) - f(u, v)); f(u, v) += d; f(v, u) = -f(u, v); e(u) -= d; e(v) += d;