Схема алгоритма Диница — различия между версиями
(Новая страница: «== Постановка задачи == Пусть дана сеть, т.е. ориентированный граф <tex>G</tex>, в котором каждому …») |
(→Ассимптотика алгоритма) |
||
Строка 29: | Строка 29: | ||
}} | }} | ||
Поскольку длина кратчайшего <tex>s \leadsto t</tex> пути не может превосходить <tex>n - 1</tex>, то, следовательно, алгоритм Диница совершает не более <tex>n - 1</tex> фазы. | Поскольку длина кратчайшего <tex>s \leadsto t</tex> пути не может превосходить <tex>n - 1</tex>, то, следовательно, алгоритм Диница совершает не более <tex>n - 1</tex> фазы. | ||
− | Таким образом, в зависимости от того, каким алгоритмом нахождения блокирующего потока мы пользовались, весь алгоритм Диница может выполняться за <tex>O(VE^2)</tex> или за <tex>O(V^2E)</tex>. Также возможно достичь ассимптотики <tex>O( | + | Таким образом, в зависимости от того, каким алгоритмом нахождения блокирующего потока мы пользовались, весь алгоритм Диница может выполняться за <tex>O(VE^2)</tex> или за <tex>O(V^2E)</tex>. Также возможно достичь ассимптотики <tex>O(VE\log V)</tex>, если использовать динамические деревья Слетора и Тарьяна. |
== Источники == | == Источники == | ||
*[http://www.e-maxx.ru/algo/dinic Алгоритм Диница на e-maxx.ru] | *[http://www.e-maxx.ru/algo/dinic Алгоритм Диница на e-maxx.ru] | ||
*[http://ru.wikipedia.org/wiki/Алгоритм_Диница Алгоритм Диница на ru.wikipedia.org] | *[http://ru.wikipedia.org/wiki/Алгоритм_Диница Алгоритм Диница на ru.wikipedia.org] |
Версия 00:56, 16 января 2011
Содержание
Постановка задачи
Пусть дана сеть, т.е. ориентированный граф
, в котором каждому ребру приписана пропускная способность , а также выделены две вершины — исток и сток . Требуется найти в этой сети поток из в максимальной величины.Используемые определения
- Дополняющая сеть, дополняющий путь
- Блокирующий поток
- Вспомогательная(слоистая) сеть.
- Для начала определим для каждой вершины обходом в глубину). Тогда во вспомогательную сеть включают все те ребра исходной сети, для которых . данной сети длину кратчайшего пути и обозначим ее (для этого можно воспользоваться
- Очевидно, полученная сеть ациклична. При этом любой путь во вспомогательной сети является кратчайшим путём в исходной.
Алгоритм
Схема алгоритма
- Для каждого ребра данной сети зададим .
- Построим вспомогательную сеть из дополняющей сети данного графа . Если , остановиться и вывести .
- Найдем блокирующий поток Алгоритм поиска блокирующего потока в ациклической сети. в . См.
- Дополним поток найденным потоком и перейдем к шагу 2.
Корректность алгоритма
Покажем, что если алгоритм завершается, то на выходе у него получается поток именно максимальной величины.
В самом деле, предположим, что в какой-то момент во вспомогательной сети, построенной для остаточной сети, не удалось найти блокирующий поток. Это означает, что сток вообще не достижим во вспомогательной сети из истока . Но поскольку она содержит в себе все кратчайшие пути из истока в остаточной сети, это в свою очередь означает, что в остаточной сети нет пути из истока в сток. Следовательно, применяя теорему Форда-Фалкерсона, получаем, что текущий поток в самом деле максимален.
Ассимптотика алгоритма
Утверждение: |
Расстояние между истоком и стоком строго увеличивается после каждой фазы алгоритма, т.е , где - значение, полученное на следующей фазе алгоритма. |
От противного. Рассмотрим кратчайший путь из истока в сток; по предположению, его длина должна сохраниться неизменной. Однако остаточная сеть на следующей фазе содержит только рёбра остаточной сети перед выполнением текущей фазы, либо обратные к ним. Таким образом, пришли к противоречию: нашёлся | путь, который не содержит насыщенных рёбер, и имеет ту же длину, что и кратчайший путь. Этот путь должен был быть "заблокирован" блокирующим потоком, чего не произошло, в чём и заключается противоречие, что и требовалось доказать.
Поскольку длина кратчайшего
пути не может превосходить , то, следовательно, алгоритм Диница совершает не более фазы. Таким образом, в зависимости от того, каким алгоритмом нахождения блокирующего потока мы пользовались, весь алгоритм Диница может выполняться за или за . Также возможно достичь ассимптотики , если использовать динамические деревья Слетора и Тарьяна.