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

1. Перенумеровать правильно вершины сети Т, отличные от s и t.

2. Построить произвольный поток φ сети Т, например, φ(u)=0 для всех ребер u.

3. Просмотреть пути, соединяющие s и t. Если поток полный, т.е. любой путь из s в t содержит хотя бы одну насыщенную дугу, для которой φ(u)=с (u), перейти к пункту 4.

В противном случае рассмотреть путь μ, все дуги которого ненасыщены и построить новый поток φ`:

 
 


φ(u), если u не принадлежит μ;

φ `(u)= φ(u)+k, если u принадлежит μ и k=min{с (ui)-φ(ui)},

где ui- дуги пути μ.

Повторить этот процесс до получения полного потока φ.

4. Присвоить целочисленные метки вершинам сети Т и знаки «+» и «-» дугам по правилам:

а) вершине s присваиваем метку 0;

б) если вершина xi получила некоторую метку, а вершина y ещё не помечена, тогда вершине y, концевой для дуги, выходящей из xi, присваиваем метку i, если φ(ui)<с (ui), а дуге (xi; y) присваиваем знак «+» (в этом случае дуга называется аугментальной или увеличивающей);

если вершина xi получила некоторую метку, а вершина y ещё не помечена, тогда вершине y, начальной для дуги, входящей в xi, присваиваем метку i, если φ(ui)>0, а дуге (y; xi) присваиваем знак «-»;

остальные непомеченные вершины и дуги метки и знака не получают;

в) повторять процесс пункта 4б) до тех пор, пока не прекратится появление новых меток. Если в результате вершина t не получила метки, то поток обладает наибольшей величиной, в противном случае перейти к пункту 5.

5. Рассмотреть последовательность помеченных вершин λ(t, …, s), каждая из которых имеет метку, равную номеру следующей вершины, и последовательность дуг υ, не обязательно являющуюся путем, соединяющих последовательные вершины из λ. Построить новый поток φ`:

φ(u), если u не принадлежит μ;

φ `(u)= φ(u)+1, если u принадлежит μ и имеет знак «+»;

φ(u)-1, если u принадлежит μ и имеет знак «-».

Перейти к пункту 4.

Пример. Оптимизировать поток информации по сети, если известны пропускные способности ее дуг.

Задача 5. Построение многополюсной кратчайшей цепи состоит в нахождении кратчайших путей между всеми парами узлов сети. Длиной dij дуги (i;j) считают расстояние между узлами i и j или стоимость потока по дуге. Если узлы i и j не соединены непосредственно, то dij:=∞. Для решения задачи используют алгоритм Флойда, основанный на преобразованиях матрицы расстояний D(0)=(dij) nn и матрицы маршрутов R(0)=(j) nn, согласно которому последовательно выбирают базовые строку и столбец k= и проверяют выполнение условия dij (k-1)> dik (k-1) +dkj (k-1), тогда dij k:= dik (k-1) +dkj (k-1) и rij k:= k.

Матрица D(n) указывает кратчайшие расстояния между узлами i и j, матрица R(n) указывает искомую кратчайшую цепь.

Задача 6. Построение о многополюсной цепи с максимальной пропускной способностью состоит в нахождении максимального потока между всеми парами узлов сети. Длиной dij дуги (i;j) считают поток между узлами i и j или пропускную способность дуги. Если узлы i и j не соединены непосредственно, то dij:=-∞. Для решения задачи используют модифицированный алгоритм Флойда (алгоритм Ху), основанный на преобразованиях матрицы расстояний D(0)=(dij)nn и матрицы маршрутов R(0)=(j) nn, последовательно выбирают базовые строку и столбец k= и проверяют условие dij (k-1)< min{dik (k-1);dkj (k-1)}, тогда dij k:= max{dij (k-1); min {dik (k-1);dkj (k-1)}} и rijk:= k. Матрица D(n) указывает максимальное значение потока между узлами i и j, матрица R(n) указывает искомую цепь.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: