Изменения

Перейти к: навигация, поиск

Алгоритм отмены цикла минимального среднего веса

875 байт добавлено, 01:26, 26 декабря 2016
Нет описания правки
В статье описывается один из сильно полиномиальных алгоритмов решения [[Поток минимальной стоимости #Задача о потоке минимальной стоимости|задачи о поиске потока минимальной стоимости]].==Алгоритм ==Приведенный алгоритм основан на идее [[Поток минимальной стоимости #Метод устранения отрицательных циклов в остаточной сети|алгоритма Клейна отмены цикла отрицательного веса]]. Выбор цикла минимального среднего веса== Приведенный вместо случайного делает алгоритм принадлежит к классу сильно полиномиальных алгоритмовполиномиальным.
{{Определение
|definition='''Сильно полиномиальными''' в контексте данной задачи называются алгоритмы, чья сложность полиномиально зависит от <tex>V</tex> {{---}} числа вершин и <tex>E</tex> {{---}} числа ребер графа.}}
 ===Описание алгоритма===Рассмотрим некоторый цикл Обозначим как <tex>c_{f}(C)</tex> остаточную пропускную способность цикла <tex>C</tex> при протекании в сети потока <tex>f</tex>. Обозначим его стоимость Cтоимость цикла <tex>C</tex> обозначим за <tex>p(C)</tex>, а его длину (число ребер, входящих в циклнего ребер) {{---}} за <tex>\texttt{len}(C)</tex>. 
{{Определение
|definition='''Средним весом цикла''' называется будем называть отношение его стоимости к его длине <tex>\mu (C)=\frac{p(C)}{\texttt{len}(C)}</tex>}} ====Сам алгоритм====* '''Шаг1'''. Рассмотрим некоторый поток <tex>f</tex>. Находим * '''Шаг2'''. Найдем цикл <tex>C</tex>, обладающий наименьшим средним весом. Если <tex>\mu (C) \geq 0</tex>, то <tex>f</tex> {{---}} поток минимальной стоимости и алгоритм завершается.Иначе, отменим * '''Шаг3'''. Отменим цикл <tex>C</tex>, пустив по нему максимально возможный поток: <tex>f := f + c_{f}(C)\cdot f_{C}</tex>, где <tex>c_{f}(C)</tex> {{---}} остаточная пропускная способность цикла <tex>C</tex>.Вернемся Перейдем к началу алгоритма'''шагу 1'''====Время работы алгоритма=Сложность===
<tex>O(VE\cdot VE^{2}\log{V})</tex>, при этом
<tex>O(VE)</tex> времени тратится на поиск цикла минимального среднего веса.
 ===Алгоритм поиска цикла минимального среднего веса=======наивный Наивный способ====Устроим [[Вещественный двоичный поиск |двоичный поиск]].установим Установим нижнюю и верхнюю границы величины среднего веса цикла <tex>l</tex> и <tex>r</tex>соответственно, вычислим середину серединное значение <tex>m</tex> и отнимем полученную величину <tex>m</tex> от всех реберсети. Если теперь в нашем графе нашей сети есть отрицательный цикл, значит существует цикл с меньшим средним весом, чем <tex>m</tex>. Тогда сдвигаем правую границу на <tex>m</tex>, иначе {{---}} левую.
Такой алгоритм будет работать за <tex>O(\texttt{log} \frac{1}{\varepsilon} \cdot EV)</tex>, где <tex>\varepsilon</tex> {{---}} точность выбора величины среднего веса цикла.
====способ убрать <tex>\texttt{log} \frac{1}{\varepsilon}</tex> из оценки====
Добавим к нашему графу вершину <tex>s</tex> и ребра из нее во все остальные вершины.
276
правок

Навигация