Нахождение величины максимального потока в сети методом Форда — Фалкерсона


Рассмотрим сеть G=(J, U) с одним источником S и одним стоком t и для всех дуг сети (i, j) заданы их пропускные способности Cij. Найти величину максимального потока в сети, который можно направить из источника в сток и минимальный разрез в сети. Метод Форда – Фалкерсона называют еще и методом пометок. Рассмотрим его по шагам.

1 шаг: находим величину начального потока в сети. В качестве начального потока можно рассмотреть нулевой поток, положив значения всех Xij=0. Однако, можно начинать и с конкретной величины потока. Величина V0 начального потока в сети найдем следующим образом. Найдем в сети пути, не имеющие общих дуг и связывающие источник со стоком. Определим потоки, текущие по этим путям. Сумма этих потоков и определит начальное значение потока V0.

2 шаг: пометим источник S меткой (clip_image002). Первая цифра этой метки и означает, что мы идем из источника. Вторая цифра означает, что величина потока в источнике не ограничено большая. Рассмотрим все помеченные вершины i (в начале это одна вершина S) и определяет все не помеченные вершины j , которые связаны дугами с вершиной i . Тем вершинам j которые связаны дугой (i, j), поток по которой Xij<Cij, присвоим метку (i+, Ej), где Еj = min(Ei, Cij — Xij), а тем вершинам j для которой Xji>0, присвоим метку (i, Ej), где Еj = min(Ei, Xji). Затем переходим к помеченной вершине j , для которой аналогично определяем непомеченные вершины, связанные с вершиной j дугами, и все непомеченные вершины помечаем аналогично тому как мы помечали вершину j.

В результате 2-го шага нам либо удается пометить вершину t , т. е. сток, либо пометить сток нельзя. Если сток нельзя пометить то поток в сети явл. максимальным. Если вершина t оказалась помеченной, то поток в сети можно увеличить.

3 шаг: вершина t может иметь метку двух видов: либо (j+, Et), либо (j ,Et).Это означает, что поток в сети можно увеличить на Et . Если метка вида (j+, Et), то это означает, что поток по дуге (j, t) увеличим на Et и новое значение потока clip_image004, где Xjt – предыдущее значение потока на дуге (j, t). Если вершина t имеет метку (j ,Et), то в этом случае поток по обратной дуге (t, j) уменьшится на Et ; и clip_image006.

И затем в каждом из этих случ. мы переходим к вершине j. Вершина j также может иметь метку двух видов: (i+, Ej) или (j, Ej).

Если метка вершины i (i+, Ej), то поток по прямой дуге (i, j) увеличивается на Et , т. е. clip_image008.

Если метка вида (i, Ej), то поток по обратной дуге (j, i) уменьшиться на Et, т. е. clip_image010

Затем переходим к вершине i. Так будем действовать до тех пор, пока не прийдем к источнику, т.е. к вершине S. Т. е. двигаясь вдоль помеченных вершин, мы выделяем некоторую цепь и на прямых дугах этой цепи увеличим поток на Et, а на обратных – уменьшается на Et. В результате этих действий новый поток в сети V0= V0+ Et.

Затем мы стираем все пометки и с полученной велич. потока V1 , обозначив clip_image012, переходим ко 2 шагу. Процесс увеличения потока в сети прекращается тогда, когда веошина t, т. е. сток пометить нельзя. Это означает, что на всех прямых дугах, связанных со стоком t, велич. потока равна пропускной способности дуг, т. е. прямые дуги насыщены потоком. А на всех обратных дугах поток равен 0. Минимальный разрез определяют дуги (i, j), для которых вершина i явл. помеченной, а вершина j – непомеченной.