Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
САиМ(методичка)_200811.doc
Скачиваний:
91
Добавлен:
27.09.2019
Размер:
5.97 Mб
Скачать

Алгоритм Форда-Фалкерсона

Шаг 0. Пропускаем по сети некоторый допустимый поток (возможно нулевой). В процессе работы алгоритма (на каждом этапе) каждая вершина относится к одному из трех множеств:

  • непомеченные вершины,

  • помеченные, но не просмотренные, (окрашенные).

  • просмотренные (окрашенные).

Шаг 1. Пометим вершину S меткой (S+, ). Остальные вершины не помечены, S помеченная, но не просмотрена.

Шаг 2. Пусть — некоторая помеченная, но не просмотренная вершина с пометкой. Рассмотрим все соседние с непомеченные вершины. Для каждой из таких вершин u возможны следующие ситуации:

  1. и , тогда вершина u получает метку ( .

  2. и , тогда u получает метку .

В обоих случаях a) и b) помечаем вершину u меткой и вносим в множество помеченных, но не просмотренных вершин.

  1. Если и или и , то u не помечается.

Когда все соседние с вершины проанализированы, переходит в множество просмотренных вершин. Окрашиваем вершину .

Шаг 3. Повторяем шаг 2 (т.е. расширяем просмотренное множество) до тех пор, пока не возникнет одна из следующих ситуаций:

  1. Все вершины графа разбиты на два подмножества:

    • просмотренные (окрашенные);

    • непомеченные вершины, включающие в себя и вершину t.

Тогда в сети построен максимальный поток мощности V и минимальный разрез (X, X*), где X – окрашенные вершины.

  1. Если вершина T получила метку, то в сети существует увеличивающий путь s t, который можно определить, идя из t обратно назад к s. Т.е. если метка у t была , то соединяем t с ν1 и т.д. Для найденного пути определяем величину увеличения мощности потока. На всех прямых дугах найденного пути изменяем f на (+ ), а на всех обратных дугах на (- ).

Мощность потока увеличилась на , т.е. V=V+ .

Переходим опять к шагу 1.

При этом множество X окрашенных вершин задает разрез (X, X*) пропускная способность которого равна мощности потока.

Пример. Для сети с заданными пропускными способностями дуг (рис. 1.17) необходимо построить поток максимальной мощности и указать разрез (X, X*) для которого M(f)=C(X, X*).

Решение На первом шаге помечается узел S (S+, ).

Шаг 1. Рассмотрим узлы, соседние с S.

Узел a помечается меткой (S+,3), т.к. (s, a) – дуга, f(s, a)=2<c(s, a)=5 и min( , 5-2)=3.

Узел b помечается меткой (S+,1), т.к. (s, b) – дуга, f(s, b)=3<c(s, b)=4 и min( , 4-3)=1.

Узел d не помечается, т.к. (s, d) – дуга и f(s, d)=4=c(c, d). Данный узел отнесем к множеству просмотренных узлов (рис. 1.18).

Рис. 1.17

(s+,)

Рис. 1.18

Шаг 2. Рассмотрим непомеченный узел t, соседний с помеченным и не просмотренным узлом a. Узел t не помечается, т.к. (a, t) – дуга и f(a, t)=2=c(a,t). Узел a после этого отнесем к множеству просмотренных узлов

Шаг 3. Рассмотрим непомеченные узлы, соседние с узлом b. Узел t не помечается, т.к. f(b, t) = 4 = c(b,t). Узел d получает пометку (b-, 1), т.к (d, b) – дуга и f(d, b)=1>0 и min( =1, f(d, b)=1). Узел b переходит к множеству просмотренных узлов (рис. 1.19).

Рис. 1.19

Шаг 4. Узел t получает метку (d+, 1), поскольку является соседним с помеченным и не просмотренным узлом d, (d, t) – дуга, и f(d, t) = 3< c(d, t) = 5 и = 1= min(1, 5-3). Определим путь P, увеличивающий поток.

Т.к. xt=d+, xd=b-, xb=s+, то P(s, b, d, t).

На прямых дугах (s, b) и (d, t) этого пути увеличиваем поток на =1, а на обратной дуге (d, b) уменьшаем на 1. Т.о. получается новый поток, больший исходного (рис. 1.20)

Рис. 1.20

Необходимо снова увеличить поток.

Пометим узел S(s+, ). Из узлов, соседних с s можно пометить лишь узел a(s+,3). Узел s переходит в множество просмотренных узлов.

Рассмотрим непомеченные узлы, соседние с узлом a.

Узел t не помечается, т.к. (a, t) – дуга и f(a, t)=2=c(a, t).

Узел b не помечается, т.к. (b, a) – дуга и f(b, a)=0.

Узел a переходит в множество просмотренных узлов.

Поскольку в сети нет помеченных и не просмотренных узлов, то полученный поток является максимальным.

Определим минимальный разрез. К множеству X относятся все помеченные узлы: X = {s, a}, к = {b, d, t}. В разрез входят дуги, идущие из узлов множества X в узлы множества , т.е. (s, b), (s, d), (a, t) (рис. 1.21).

Величина потока V=10 равна суммарной пропускной способности дуг разреза.

Рис. 1.21