
Алгоритм построения максимального потока в сети по методу Диница с помощью функций psa и maxpsa
Исходные данные:
- LIST[v], PREV[v], v V – списки смежности и предшествования, задающие сеть;
- С[u][v], u, v V – пропускные способности дуг;
- s V, tV – источник и сток.
Рабочая память:
- XV,F[u][v] – множество вершин вспомогательной сети и поток в ней,
- D[v] – «расстояния» (к-ва дуг в увеличивающей цепи) отsдоvво вспомогательной сети,
- XLIST[u]v],XPREV[u][v],C[u][v] – вспомогательная сеть.
Результат:
- F[u][v], u, v V – максимальный поток.
main() {
(u V)
(vV) F[u][v] = 0;
do {
PSA( ); // построение вспомогательной бесконтурной сети
if ( D[t] != ) { // поток не является максимальным
MAXPSA( ); // построение максимального потока
// перенесение потока в главную сеть
(uXV)
(vXV) { // XV – множество в-н вспомогательной сети
F[u][v] += XF[u][v];
if (F[u][v] > C[u][v]) {
F[v][u] – = (F[u][v] – C[u][v]);
F[u][v] = C[u][v];
}
}
} // конец фазы
} while (D[t] != ); // поток F – максимальный
}
По окончании работы алгоритма PSAD[t] =l. Еслиl=, то стокtне достигнут, увеличивающей цепи нет, и поток в сети – максимальный. По достижении стока, когдаD[t] <, все вновь встреченные вершины уже не рассматриваются.
Далее во вспомогательной сети строится псевдомаксимальный поток f*. Это поток, для которого нельзя найти увеличивающей цепи длиныlотносительно этого потока, т. е. на некотором пути изs вt имеется дуга <vi,vi+1>, 0≤i≤l такая, чтоf*(vi, vi+1) =c (vi, vi+1).
Далее поток f*переносится в основную сеть, складываясь с f :f*(u, v) прибавляется к f (u, v), а при превышении лимитаc (u, v) производится уменьшениеf (v, u). В результате получаем новый потокW (f’ ) =W (f ) +W (f* ).
Сложность: исходя из анализа функций PSA и MAXPSA, а также учитывая, что число фаз не превосходит n, получаем для всего алгоритма оценкуO(n3)..
Пример. Вычисление максимального потока по алгоритму Диница
Исходный поток полагаем нулевым. Ищем увеличивающую цепь. Вершины с нулевым потенциалом исключает из обработки. Из оставшихся вершин ищем вершину с минимальным потенциалом. От неё, перемещая соответствующий «груз» в начало и в конец сети, находим псевдомаксимальный поток.
Переносим найденный поток в исходную сеть и повторяем всё с начала. Обратите внимание на то, что поток, найденный в фазе 2 – не максимальный.
Снова переносим найденный поток в исходную сеть. Между вершинами 3 и 7 насыщаем потоком одну дугу, а остаток передаём во вторую.
В полученной сети уже невозможно найти увеличивающую цепь, следовательно, найденный поток – максимальный.
1Липский В. Комбинаторика для программистов: пер. с польск. – М.: Мир, 1988. – 213 с., ил. – С.136–154.
2Форд Л.Р., Фалкерсон Д.Р. Потоки в сетях. – М.: Мир, 1966.
3Диниц Е.А. Алгоритм решения задачи о максимальном потоке в сети со степенной оценкой. Докл. АН СССР, Серия Мат., Физ., 1970, 194, 4. – C.754–757.
4 Malhotra V.M., Kumar P.M., Maheshwari S.N. An O(|V|3) algorithm for finding maximum flows in networks. Information Processing Lett., 1978, 7. – S.277–278.
.