25.2.3 Алгоритм нахождения максимального потока
Рассмотрим алгоритм определения максимального потока в сети. Этот алгоритм состоит из двух фаз.
В первой фазе по заданному потоку, используя процедуру пометок вершин, проверяем, существует ли хотя бы одна дополняющая цепь.
Если такой цепи нет, то данный поток максимален.
Иначе
переходим ко второй фазе, в которой,
используя метки, полученные в первой
фазе, определим дополняющую цепь Р– и получим измененный на основе цепиРпоток
.
Затем
первая фаза повторяется для нового
потока
.
В первой
фазе метка вида (dv,
v)
приписывается вершинеv.
Первый символ dv в метке указывает на вершину, из которойvполучила эту метку. Она также указывает и направление помечивания – прямое или обратное.
Второй символ показывает возможное приращение потока в сети.
Если
вершина сток tполучает
метку, то это значит, что существует
ненасыщеннаяs—tцепьРи что для этой цепи
=
t.
Первая
фаза начинается с пометки источника
парой (–,
).
Здесь значениеdsнесущественно. Пометка остальных вершин
происходит в соответствии со следующими
правилами.
Предположим, что вершина ипомечена, а вершинаvнет. Пустье – дуга, связывающаяииv.
Прямое
помечивание. Если дугаeпрямая, т.е.е =(u,
v), то прямое
помечиваниеvизи
вдоль дугиевозможно, еслиc(e)>f(e).В этом случаеvполучает
метку (u+,
v),
где
v
= min{
u,c(e)– f(e)}.
Обратное
помечивание.Еслиeобратная дуга, т. е.е = (v,и), то обратное помечиваниеvизивдоль дугиевозможно, еслиf(e)>0.В этом случаеvполучает
метку (и–,
v),
где
v
= min{
u,f(e)}.
На первой фазе вершины помечаются только однажды.
Эта фаза завершается, когда либо
вершина tполучает метку, либо
вершина t не помечена, и ни одну из вершин нельзя пометить.
Если tполучает метку в первой фазе, то из
правил помечивания следует, что существует
дополняющая цепьРи
=
t,
которая прослеживается во второй фазе
в обратном направлении с помощью символовdvи определяется измененный на основеРпоток
.
Затем
первая фаза повторяется применительно
к новому потоку
.
Если первая фаза завершается, не приписав метки вершине t, то это означает, что ни одной дополняющей цепи нет и, следовательно, имеющийся поток максимален.
Формальное описание алгоритма, предложенного Фордом и Фалкерсоном, представлено ниже.
Алгоритм:
Выбрать какой–либо поток fв сети.можно положитьf(e) = 0 для всех дуг вN.
Пометить sпарой (–,
).
(Начинаетсяфаза
1.)Если существуют непомеченные вершины, которые можно пометить с помощью прямого или обратного помечивания, то выбрать одну такую вершину v. (Правила выбора вершин см. ниже.) Пометить ее и перейти к шагу 4. Иначе идти к шагу 7.
Если v = t,то идти к шагу 5. (Фаза 1 завершена.) Иначе к шагу 3.
(Начинается фаза 2.) Пусть метка вершиныv есть (dv,
v).
Тогда выполнить следующие действия:
если dv=
u+, то
положитьf(и, v)= f(u,v)
+
t,
если dv=
u–,то положитьf(v,
u) =f(v,
u) –
t.
Если u = s,то удалить все метки (фаза 2 завершена) и идти к шагу 2. Иначе положитьv = uи идти к шагу 5.
СТОП. (Полученный поток f – максимален.)
В рассмотренном алгоритме выбор вершин для помечивания производится в произвольном порядке, что может привести к зацикливанию. Для устранения этого недостатка выбор вершин следует производить руководствуясь правилом “первая помечена – первая должна использоваться для продолжения помечивания вершин”. “Использование” здесь означает помечивание (когда это возможно) всех непомеченных вершин, смежных с рассматриваемой вершиной. В этом случае алгоритм закончит работу через конечное число шагов, причем число построенных цепей не превысит m(n+2)/2, гдеn– число вершин сети,m– число дуг.
П
ример.Рассмотрим сетьN, представленную
на рис. 25.3. На рисунке рядом с каждой
дугойепоказаны значенияс(е)
иf(e)
соответственно.
В качестве начального потока принимаем f(e) = 0 для всех дуг сети.
Рисунок 25.3
Начиная
с метки (–,
)
для источникаs, помечаем (шаг 3
алгоритма) вершиныа,b,
с, dиtв указанном порядке. Получаем метки
а: (s+, 3),b: (а+, 3),с: (а+, 3),d: (c+,2),t: (b+,2).
Первая фаза завершается, так как вершина tпомечена.
Во второй фазе определяем дополняющую цепь Ри измененный потокf1 (шаги 3 и 6 алгоритма).
Первый
символ в метке tестьb+. Это означает,
что в цепиРвершинаbпредшествует вершинеt.Первый символ
в меткеbуказывает,
что вершинаапредшествует вершинеb. Аналогично видим, чтоsпредшествуетав цепиР. Таким
образом,Р:
.
Все
дуги в Рявляются прямыми, поэтому
для получения измененного потокаf1увеличиваем потоки во всех дугах путиРна
t
= 2.
Поток f1имеет величину, равную 2, и изображен на рис.25.4, а.
Р
исунок
25.4
Стираем
метки всех вершин. Имея поток f1,
получаем новое множество меток, показанных
на рис. 25.4, а.Добавляющая цепь по
отношению кf1состоит из вершинs,с, d,
tв указанном порядке.
Все дуги в этой цепиРявляются
прямыми,
t
= 2. Поэтому потоки в этих дугах
увеличиваются на 2.
Получающийся поток f2 = 4 показан на рис. 25.4, б.
Новые метки, основанные на f2 = 4, показаны на рис.25. 4, б.
Дополняющая
цепь по отношению к f2состоит из вершинs,с,b,а,d, t. Дуга, соединяющая
вершиныаиb,
является обратной дугой в этой цепи.
Все другие дуги являются прямыми.
t
= 1. Увеличим потоки в прямых дугах
на 1 и настолько же уменьшим поток в
обратной дуге. Получающийся в результате
потокf3= 5
представлен на рис. 25.4, в.
Имея f3, переходим к помечиванию вершин. Этот процесс завершается в состоянии, показанном на рис. 25.4, в, когда вершинаtеще не помечена. Таким образом, не существует дополняющей цепи по отношению к потокуf3. Поэтомуf3= 5 – максимальный поток.
