Участник:Anastasy/Алгоритм Диница

Материал из Алговики
Перейти к навигации Перейти к поиску

1 Постановка задачи

1.1 Общее описание алгоритма

Алгоритм Диница [1] — полиномиальный алгоритм, предназначенный для поиска максимального потока в транспортной сети. Он был предложен советским учёным Ефимом Диницем в 1970 году. Временная сложность алгоритма O(nm^2), где m — число ребер, а n — число вершин.

Основная идея алгоритма состоит в том, чтобы итеративно увеличивать величину потока вдоль некоторых путей из истока в сток. Алгоритм Диница схож с алгоритмом Эдмондса-Карпа[2], но основное отличие можно понимать так: на каждой итерации поток увеличивается не вдоль одного кратчайшего пути из истока в сток, а вдоль целого набора таких путей.

1.2 Математическое описание алгоритма

Математическая постановка задачи приведена в статье "Поиск максимального потока в транспортной сети", мы будем использовать введённые в ней обозначения.

Введём необходимые определения.

Остаточной сетью G^R по отношению к сети G=(V, E) и некоторому потоку f в ней называется сеть, в которой каждому ребру (u,v) \in E с пропускной способностью c_{uv} и потоком f_{uv} соответствуют два ребра:

  • (u,v) с пропускной способностью c_{uv}^R = c_{uv} - f_{uv}
  • (v,u) с пропускной способностью c_{vu}^R = f_{uv}

Стоит отметить, что при таком определении в остаточной сети могут появляться кратные рёбра: если в исходной сети было как ребро (u,v), так и (v,u).

Блокирующим потоком в данной сети называется такой поток, что любой путь из истока s в сток t содержит насыщенное этим потоком ребро (то есть c_{uv} = f_{uv} для некоторых u,v \in V). Иными словами, в данной сети не найдётся такого пути из истока в сток, вдоль которого можно беспрепятственно увеличить поток.

Блокирующий поток не обязательно максимален. Согласно теореме Форда-Фалкерсона поток будет максимальным тогда и только тогда, когда в остаточной сети G^R не найдётся s-t пути; в блокирующем же потоке ничего не утверждается о существовании пути по рёбрам, появляющимся в остаточной сети.

Слоистая сеть для данной сети строится следующим образом. Сначала определяются длины кратчайших путей из истока s до всех остальных вершин; назовём уровнем {\rm level}[v] вершины её расстояние от истока. Тогда в слоистую сеть включают все те рёбра (u,v) исходной сети, которые ведут с одного уровня на какой-либо другой, более поздний, уровень, т.е. {\rm level}[u] + 1 = {\rm level}[v] (разница расстояний не может превосходить единицы, это следует из свойства кратчайших расстояний). Таким образом, удаляются все рёбра, расположенные целиком внутри уровней, а также рёбра, ведущие назад, к предыдущим уровням.

Слоистая сеть ациклична. Кроме того, любой s-t путь в слоистой сети является кратчайшим путём в исходной сети.

Алгоритм представляет собой несколько фаз. На каждой фазе сначала строится остаточная сеть, затем по отношению к ней строится слоистая сеть (обходом в ширину), а в ней ищется произвольный блокирующий поток. Найденный блокирующий поток прибавляется к текущему потоку, и на этом очередная итерация заканчивается. Алгоритм заканчивает свою работу, когда в построенной на некоторой итерации остаточной сети не найдётся s-t пути.

1.3 Вычислительное ядро алгоритма

Наибольший объем вычислений приходится на:

  • поиск в ширину (для построения слоистой сети)
  • обход в глубину (для построения блокирующего потока)

1.4 Макроструктура алгоритма

Структуру алгоритма можно описать следующим образом:

  1. Для всех ребер (u, v) \in E сети G присвоим f_{uv}=0.
  2. Построим остаточную сеть G^R по отношению к сети G и потоку f. Если {\rm level}[t]=∞ алгоритм завершает работу и выводит поток f.
  3. Ищем блокирующий поток f' в сети G^R
  4. Прибавим f' к потоку f и переходим к шагу 2.

2 Программная реализация алгоритма

3 Литература

  1. Yefim Dinitz (1970). "Algorithm for solution of a problem of maximum flow in a network with power estimation". Doklady Akademii nauk SSSR.
  2. Edmonds, Jack; Karp, Richard M. (1972). "Theoretical improvements in algorithmic efficiency for network flow problems". Journal of the ACM. Association for Computing Machinery