Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СиАОД / Sd4-2.doc
Скачиваний:
34
Добавлен:
01.05.2014
Размер:
659.97 Кб
Скачать

Алгоритм построения максимального потока в сети по методу Диница с помощью функций psa и maxpsa

Исходные данные:

- LIST[v], PREV[v], v V – списки смежности и предшествования, задающие сеть;

- С[u][v], u, v V – пропускные способности дуг;

- s V, tV – источник и сток.

Рабочая память:

- 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)

(vV) F[u][v] = 0;

do {

PSA( ); // построение вспомогательной бесконтурной сети

if ( D[t] != ) { // поток не является максимальным

MAXPSA( ); // построение максимального потока

// перенесение потока в главную сеть

(uXV)

(vXV) { // 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≤il такая, чтоf*(vi, vi+1) =(vi, vi+1).

Далее поток f*переносится в основную сеть, складываясь с f :f*(u, v) прибавляется к (u, v), а при превышении лимитаc (u, v) производится уменьшение(v, u). В результате получаем новый поток(f) =(f ) +(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.

. (с)Колинько П.Г.: 01.03.17 5:13

10

Соседние файлы в папке СиАОД