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) указывает искомую цепь.