Алгоритм отмены цикла минимального среднего веса — различия между версиями
Penguinni (обсуждение | вклад) (→способ убрать \texttt{log} \frac{1}{\varepsilon} из оценки) |
Penguinni (обсуждение | вклад) (→Продвинутый алгоритм) |
||
Строка 23: | Строка 23: | ||
===Продвинутый алгоритм=== | ===Продвинутый алгоритм=== | ||
Добавим к нашему графу вершину <tex>s</tex> и ребра из нее во все остальные вершины. | Добавим к нашему графу вершину <tex>s</tex> и ребра из нее во все остальные вершины. | ||
− | Рассмотрим [[алгоритм Форда-Беллмана]] и попросим его построить нам | + | Рассмотрим [[алгоритм Форда-Беллмана]] и попросим его построить нам квадратную матрицу со следующим условием: <tex>d[i][u]</tex> {{---}} длина минимального пути от <tex>s</tex> до <tex>u</tex> ровно из <tex>i</tex> ребер. |
− | < | ||
− | |||
− | </ | ||
Тогда длина оптимального цикла <tex>\mu^{*}</tex> минимального среднего веса вычисляется как <tex>\min\limits_{u} {\max\limits_{k} {\frac{d[n][u]-d[k][u]}{n-k}}}</tex>. | Тогда длина оптимального цикла <tex>\mu^{*}</tex> минимального среднего веса вычисляется как <tex>\min\limits_{u} {\max\limits_{k} {\frac{d[n][u]-d[k][u]}{n-k}}}</tex>. | ||
+ | Достаточно будет доказать это правило для <tex>\mu^{*}=0</tex>, так как для других <tex>\mu^{*}</tex> можно просто отнять эту величину от всех ребер и получить снова случай с <tex>\mu^{*}=0</tex>. | ||
− | + | Чтобы найти цикл после построения матрицы <tex>d[k][u]</tex>, запомним, при каких <tex>u</tex> и <tex>k</tex> достигается оптимальное значение <tex>\mu^{*}</tex>, и, используя <tex>d[n][u]</tex>, поднимемся по указателям предков. Как только мы попадем в уже посещенную вершину {{---}} мы нашли цикл минимального среднего веса. | |
− | |||
− | |||
− | |||
− | |||
Этот алогоритм работает за <tex>O(VE)</tex>. | Этот алогоритм работает за <tex>O(VE)</tex>. |
Версия 22:49, 26 декабря 2016
В статье описывается один из сильно полиномиальных алгоритмов решения задачи о поиске потока минимальной стоимости.
Содержание
Алгоритм
Приведенный алгоритм основан на идее алгоритма Клейна отмены цикла отрицательного веса. Выбор цикла минимального среднего веса вместо случайного делает алгоритм сильно полиномиальным.
Определение: |
Сильно полиномиальными в контексте данной задачи называются алгоритмы, чья сложность полиномиально зависит от | — числа вершин и — числа ребер графа.
Описание
Обозначим как
остаточную пропускную способность цикла при протекании в сети потока . Cтоимость цикла обозначим за , а длину (число входящих в него ребер) — за .Определение: |
Средним весом цикла будем называть отношение его стоимости к его длине |
- Шаг1. Рассмотрим некоторый поток .
- Шаг2. Найдем цикл , обладающий наименьшим средним весом. Если , то — поток минимальной стоимости и алгоритм завершается.
- Шаг3. Отменим цикл , пустив по нему максимально возможный поток: . Перейдем к шагу 1.
Сложность
, при этом времени тратится на поиск цикла минимального среднего веса.
Алгоритм поиска цикла минимального среднего веса
Наивный способ
Устроим двоичный поиск. Установим нижнюю и верхнюю границы величины среднего веса цикла и соответственно, вычислим серединное значение и отнимем полученную величину от всех ребер сети. Если теперь в нашей сети есть отрицательный цикл (этот факт можно проверить при помощи алгоритма Форда-Беллмана), значит существует цикл с меньшим средним весом, чем . Тогда продолжим поиск среди значений в диапазоне от до , иначе — от до . Такой алгоритм будет работать за , где — точность выбора величины среднего веса цикла.
Продвинутый алгоритм
Добавим к нашему графу вершину алгоритм Форда-Беллмана и попросим его построить нам квадратную матрицу со следующим условием: — длина минимального пути от до ровно из ребер. Тогда длина оптимального цикла минимального среднего веса вычисляется как . Достаточно будет доказать это правило для , так как для других можно просто отнять эту величину от всех ребер и получить снова случай с .
и ребра из нее во все остальные вершины. РассмотримЧтобы найти цикл после построения матрицы
, запомним, при каких и достигается оптимальное значение , и, используя , поднимемся по указателям предков. Как только мы попадем в уже посещенную вершину — мы нашли цикл минимального среднего веса.Этот алогоритм работает за
.