Алгоритм отмены цикла минимального среднего веса — различия между версиями
Penguinni (обсуждение | вклад) |
Penguinni (обсуждение | вклад) (→Наивный способ) |
||
Строка 18: | Строка 18: | ||
===Наивный способ=== | ===Наивный способ=== | ||
Устроим [[Вещественный двоичный поиск |двоичный поиск]]. | Устроим [[Вещественный двоичный поиск |двоичный поиск]]. | ||
− | Установим нижнюю и верхнюю границы величины среднего веса цикла <tex>l</tex> и <tex>r</tex> соответственно, вычислим серединное значение <tex>m</tex> и отнимем полученную величину <tex>m</tex> от всех ребер сети. Если теперь в нашей сети есть отрицательный цикл, значит существует цикл с меньшим средним весом, чем <tex>m</tex>. Тогда | + | Установим нижнюю и верхнюю границы величины среднего веса цикла <tex>l</tex> и <tex>r</tex> соответственно, вычислим серединное значение <tex>m</tex> и отнимем полученную величину <tex>m</tex> от всех ребер сети. Если теперь в нашей сети есть отрицательный цикл (этот факт можно проверить при помощи [[Алгоритм Форда-Беллмана #Нахождение отрицательного цикла|алгоритма Форда-Беллмана]]), значит существует цикл с меньшим средним весом, чем <tex>m</tex>. Тогда продолжим поиск среди значений в диапазоне от <tex>l</tex> до <tex>m</tex>, иначе {{---}} от <tex>m</tex> до <tex>r</tex>. |
Такой алгоритм будет работать за <tex>O(\texttt{log} \frac{1}{\varepsilon} \cdot EV)</tex>, где <tex>\varepsilon</tex> {{---}} точность выбора величины среднего веса цикла. | Такой алгоритм будет работать за <tex>O(\texttt{log} \frac{1}{\varepsilon} \cdot EV)</tex>, где <tex>\varepsilon</tex> {{---}} точность выбора величины среднего веса цикла. | ||
+ | |||
===способ убрать <tex>\texttt{log} \frac{1}{\varepsilon}</tex> из оценки=== | ===способ убрать <tex>\texttt{log} \frac{1}{\varepsilon}</tex> из оценки=== | ||
Версия 01:31, 26 декабря 2016
В статье описывается один из сильно полиномиальных алгоритмов решения задачи о поиске потока минимальной стоимости.
Содержание
Алгоритм
Приведенный алгоритм основан на идее алгоритма Клейна отмены цикла отрицательного веса. Выбор цикла минимального среднего веса вместо случайного делает алгоритм сильно полиномиальным.
Определение: |
Сильно полиномиальными в контексте данной задачи называются алгоритмы, чья сложность полиномиально зависит от | — числа вершин и — числа ребер графа.
Описание
Обозначим как
остаточную пропускную способность цикла при протекании в сети потока . Cтоимость цикла обозначим за , а длину (число входящих в него ребер) — за .Определение: |
Средним весом цикла будем называть отношение его стоимости к его длине |
- Шаг1. Рассмотрим некоторый поток .
- Шаг2. Найдем цикл , обладающий наименьшим средним весом. Если , то — поток минимальной стоимости и алгоритм завершается.
- Шаг3. Отменим цикл , пустив по нему максимально возможный поток: . Перейдем к шагу 1.
Сложность
, при этом времени тратится на поиск цикла минимального среднего веса.
Алгоритм поиска цикла минимального среднего веса
Наивный способ
Устроим двоичный поиск. Установим нижнюю и верхнюю границы величины среднего веса цикла и соответственно, вычислим серединное значение и отнимем полученную величину от всех ребер сети. Если теперь в нашей сети есть отрицательный цикл (этот факт можно проверить при помощи алгоритма Форда-Беллмана), значит существует цикл с меньшим средним весом, чем . Тогда продолжим поиск среди значений в диапазоне от до , иначе — от до . Такой алгоритм будет работать за , где — точность выбора величины среднего веса цикла.
способ убрать из оценки
Добавим к нашему графу вершину
d[i][u] // длина минимального пути от s до u ровно из i ребер
Тогда длина оптимального цикла
минимального среднего веса вычисляется как .Почему это так? Грубо говоря, достаточно доказать для
, так как для других можно просто отнять его величину от всех ребер и получить рассматриваемый случай.--- как же найти сам цикл Запомним, при каких
и достигается этот минимум, и, используя , по указателям предков поднимаемся. Как только мы зациклимся — мы нашли цикл минимального среднего веса.Этот алогоритм работает за
.