Алгоритм отмены — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Новая страница: «==Алгоритм отмены цикла минимального среднего веса== Приведенный алгоритм принадлежит к...»)
 
Строка 13: Строка 13:
 
====Сам алгоритм====
 
====Сам алгоритм====
 
Рассмотрим некоторый поток <tex>f</tex>. Находим цикл <tex>C</tex>, обладающий наименьшим средним весом. Если <tex>\mu (C) \geq 0</tex>, то <tex>f</tex> {{---}} поток минимальной стоимости и алгоритм завершается.
 
Рассмотрим некоторый поток <tex>f</tex>. Находим цикл <tex>C</tex>, обладающий наименьшим средним весом. Если <tex>\mu (C) \geq 0</tex>, то <tex>f</tex> {{---}} поток минимальной стоимости и алгоритм завершается.
Иначе, отменим цикл <tex>C</tex>: <tex>f := f + c_{f}(C)\cdot f_{C}, где <tex>c_{f}(C) {{---}} остаточная пропускная способность цикла <tex>C</tex>.
+
Иначе, отменим цикл <tex>C</tex>: <tex>f := f + c_{f}(C)\cdot f_{C}</tex>, где <tex>c_{f}(C)</tex> {{---}} остаточная пропускная способность цикла <tex>C</tex>.
 
Вернемся к началу алгоритма.
 
Вернемся к началу алгоритма.
  
 
====Время работы алгоритма====
 
====Время работы алгоритма====
<tex>O(VE\cdot VE^{2}\log{V})</tex>
+
<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> из оценки====

Версия 22:20, 25 декабря 2016

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

Приведенный алгоритм принадлежит к классу сильно полиномиальных алгоритмов.

Определение:
Сильно полиномиальными в контексте данной задачи называются алгоритмы, чья сложность полиномиально зависит от [math]V[/math] — числа вершин и [math]E[/math] — числа ребер графа.


Описание алгоритма

Рассмотрим некоторый цикл [math]C[/math]. Обозначим его стоимость за [math]p(C)[/math], а его длину (число ребер, входящих в цикл) за [math]\texttt{len}(C)[/math].


Определение:
Средним весом цикла называется отношение его стоимости к его длине [math]\mu (C)=\frac{p(C)}{\texttt{len}(C)}[/math]


Сам алгоритм

Рассмотрим некоторый поток [math]f[/math]. Находим цикл [math]C[/math], обладающий наименьшим средним весом. Если [math]\mu (C) \geq 0[/math], то [math]f[/math] — поток минимальной стоимости и алгоритм завершается. Иначе, отменим цикл [math]C[/math]: [math]f := f + c_{f}(C)\cdot f_{C}[/math], где [math]c_{f}(C)[/math] — остаточная пропускная способность цикла [math]C[/math]. Вернемся к началу алгоритма.

Время работы алгоритма

[math]O(VE\cdot VE^{2}\log{V})[/math], при этом [math]O(VE)[/math] времени тратится на поиск цикла минимального среднего веса.

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

наивный способ

Устроим двоичный поиск. установим нижнюю и верхнюю границы [math]l[/math] и [math]r[/math], вычислим середину [math]m[/math] и отнимем величину [math]m[/math] от всех ребер. Если теперь в нашем графе есть отрицательный цикл, значит существует цикл с меньшим средним весом, чем [math]m[/math]. Тогда сдвигаем правую границу на [math]m[/math], иначе — левую. Такой алгоритм будет работать за [math]O(\texttt{log} \frac{1}{\varepsilon} \cdot EV)[/math], где [math]\varepsilon[/math] — точность выбора величины среднего веса цикла.

способ убрать [math]\texttt{log} \frac{1}{\varepsilon}[/math] из оценки