Схема алгоритма Диница — различия между версиями
Dimitrova (обсуждение | вклад) (→Асимптотика алгоритма) |
Dimitrova (обсуждение | вклад) (→Реализация) |
||
Строка 29: | Строка 29: | ||
==Реализация== | ==Реализация== | ||
− | + | bfs() | |
− | <tex> | + | <tex>Q \leftarrow \emptyset</tex> |
− | <tex> | + | <tex>Q</tex>.push(<tex>s</tex>) |
− | + | while <tex>Q \ne \emptyset</tex> | |
− | <tex>for (v : | + | <tex>u \leftarrow Q</tex>.pop |
+ | <tex>for (v :</tex> поток из <tex>u</tex> в <tex>v</tex> положителен и <tex>v</tex> не посещена) | ||
<tex>dist[v] \leftarrow dist[u] + 1 </tex> | <tex>dist[v] \leftarrow dist[u] + 1 </tex> | ||
− | <tex> | + | <tex>Q</tex>.push(<tex>v</tex>) |
− | <tex> | + | <tex>Q</tex>.pop() |
− | + | makeGl() | |
− | <tex>dist \leftarrow </tex> | + | <tex>dist \leftarrow 0</tex> |
− | + | bfs() | |
− | |||
− | |||
− | |||
− | + | algorithmDinica() | |
− | <tex>flow \leftarrow</tex> | + | <tex>flow \leftarrow 0</tex> |
− | + | makeGl() | |
− | + | while (<tex>t</tex> достижима) | |
− | <tex> f | + | Ищем блокирующий поток |
− | вывести поток <tex> f </tex> | + | Меняем поток <tex>f</tex> |
+ | makeGl() | ||
+ | вывести поток <tex>f</tex> | ||
== Источники == | == Источники == |
Версия 09:45, 17 января 2012
Содержание
Определение слоистой сети
Для начала определим для каждой вершины обходом в ширину).
В слоистую сеть включаем только те ребра исходной сети, для которых .
Полученная сеть ациклична, и любой путь во вспомогательной сети является кратчайшим путём в исходной, из свойств обхода в ширину.
В примере ребра, обозначенные пунктиром, не входят в слоистую сеть.
Алгоритм
Пусть дана сеть. Требуется найти в этой сети поток из в максимальной величины.
Схема алгоритма
- Для каждого ребра данной сети зададим .
- Построим вспомогательную сеть дополняющей сети данного графа . Если , остановиться и вывести . из
- Найдем блокирующий поток . в .
- Дополним поток найденным потоком и перейдем к шагу 2.
Корректность алгоритма
Покажем, что если алгоритм завершается, то на выходе у него получается поток именно максимальной величины.
В самом деле, предположим, что в какой-то момент во вспомогательной сети, построенной для остаточной сети, не удалось найти блокирующий поток. Это означает, что сток вообще не достижим во вспомогательной сети из истока. Но поскольку она содержит в себе все кратчайшие пути из истока в остаточной сети, это в свою очередь означает, что в остаточной сети нет пути из истока в сток. Следовательно, применяя теорему Форда-Фалкерсона, получаем, что текущий поток в самом деле максимален.
Асимптотика алгоритма
Теорема: |
Расстояние между истоком и стоком строго увеличивается после каждой фазы алгоритма, т.е. , где — значение, полученное на следующей фазе алгоритма. |
Доказательство: |
Проведём доказательство от противного. Пусть длина кратчайшего пути из истока в сток останется неизменной после очередной фазы алгоритма. Тогда остаточная сеть будет содержать только рёбра остаточной сети перед выполнением данной фазы, либо обратные к ним. Из этого получаем, что нашёлся | путь, который не содержит насыщенных рёбер и имеет ту же длину, что и кратчайший путь. Но этот путь должен был быть «заблокирован» блокирующим потоком, чего не произошло. Получили противоречие. Значит длина изменилась.
Поскольку длина кратчайшего
пути не может превосходить , то, следовательно, алгоритм Диница совершает не более фазы. Таким образом, в зависимости от того, каким алгоритмом нахождения блокирующего потока мы пользовались, весь алгоритм Диница может выполняться за или за . Также возможно достичь асимптотики , если использовать динамические деревья Слетора и Тарьяна.Реализация
bfs().push( ) while .pop поток из в положителен и не посещена) .push( ) .pop()
makeGl()
bfs()
algorithmDinica()makeGl() while ( достижима) Ищем блокирующий поток Меняем поток makeGl() вывести поток
Источники
- Алгоритм Диница на e-maxx.ru
- Алгоритм Диница на ru.wikipedia.org
- Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — С. 1296. — ISBN 5-8489-0857-4