Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
3 - Графы / Лекция 24 Сети.doc
Скачиваний:
96
Добавлен:
09.04.2015
Размер:
208.38 Кб
Скачать

25.2.3 Алгоритм нахождения максимального потока

Рассмотрим алгоритм определения максимального потока в сети. Этот алгоритм состоит из двух фаз.

В первой фазе по заданному потоку, используя процедуру пометок вершин, проверяем, существует ли хотя бы одна дополняющая цепь.

Если такой цепи нет, то данный поток максимален.

Иначе переходим ко второй фазе, в которой, используя метки, полученные в первой фазе, определим дополняющую цепь Р– и получим измененный на основе цепиРпоток.

Затем первая фаза повторяется для нового потока .

В первой фазе метка вида (dv,v) приписывается вершинеv.

Первый символ dv в метке указывает на вершину, из которойvполучила эту метку. Она также указывает и направление помечивания – прямое или обратное.

Второй символ показывает возможное приращение потока в сети.

Если вершина сток tполучает метку, то это значит, что существует ненасыщеннаяstцепьРи что для этой цепи=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, то это означает, что ни одной дополняющей цепи нет и, следовательно, имеющийся поток максимален.

Формальное описание алгоритма, предложенного Фордом и Фалкерсоном, представлено ниже.

Алгоритм:

  1. Выбрать какой–либо поток fв сети.можно положитьf(e) = 0 для всех дуг вN.

  2. Пометить sпарой (–,). (Начинаетсяфаза 1.)

  3. Если существуют непомеченные вершины, которые можно пометить с помощью прямого или обратного помечивания, то выбрать одну такую вершину v. (Правила выбора вершин см. ниже.) Пометить ее и перейти к шагу 4. Иначе идти к шагу 7.

  4. Если v = t,то идти к шагу 5. (Фаза 1 завершена.) Иначе к шагу 3.

  5. (Начинается фаза 2.) Пусть метка вершиныv есть (dv,v). Тогда выполнить следующие действия:

если dv= u+, то положитьf(и, v)= f(u,v) +t,

если dv= u,то положитьf(v, u) =f(v, u) –t.

  1. Если u = s,то удалить все метки (фаза 2 завершена) и идти к шагу 2. Иначе положитьv = uи идти к шагу 5.

  2. СТОП. (Полученный поток 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 – максимальный поток.