<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=78.30.250.115&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=78.30.250.115&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/78.30.250.115"/>
		<updated>2026-04-09T08:56:30Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE%D1%82%D0%B5%D0%BD%D1%86%D0%B8%D0%B0%D0%BB%D0%BE%D0%B2_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%BE%D0%BD%D0%B0_%D0%BF%D1%80%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B5_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8&amp;diff=74962</id>
		<title>Использование потенциалов Джонсона при поиске потока минимальной стоимости</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE%D1%82%D0%B5%D0%BD%D1%86%D0%B8%D0%B0%D0%BB%D0%BE%D0%B2_%D0%94%D0%B6%D0%BE%D0%BD%D1%81%D0%BE%D0%BD%D0%B0_%D0%BF%D1%80%D0%B8_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B5_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0_%D0%BC%D0%B8%D0%BD%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B9_%D1%81%D1%82%D0%BE%D0%B8%D0%BC%D0%BE%D1%81%D1%82%D0%B8&amp;diff=74962"/>
				<updated>2020-07-23T14:54:21Z</updated>
		
		<summary type="html">&lt;p&gt;78.30.250.115: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Метод интересен прежде всего тем, что [[Сведение задачи о назначениях к задаче о потоке минимальной стоимости|задачу о назначениях]] можно свести к задаче о поиске потока минимальной стоимости, и тогда эффективность решения задачи о назначениях будет определяться именно асимптотикой работы этого алгоритма.&lt;br /&gt;
&lt;br /&gt;
== Мотивация ==&lt;br /&gt;
&lt;br /&gt;
Зачем нужно использовать потенциалы Джонсона?&lt;br /&gt;
&lt;br /&gt;
Идея аналогична идее, использующейся в [[Алгоритм Джонсона|алгоритме Джонсона]].&lt;br /&gt;
&lt;br /&gt;
При [[Поиск потока минимальной стоимости методом дополнения вдоль путей минимальной стоимости|поиске потока минимальной стоимости методом дополнения вдоль путей минимальной стоимости]] нам требуется находить минимальный по стоимости поток из истока в сток. Это реализуется с помощью алгоритмов поиска кратчайшего пути в графе. Поскольку стоимость некоторых рёбер может быть отрицательной, нам приходится использовать [[Алгоритм Форда-Беллмана|алгоритм Форда-Беллмана]]. Однако гораздо эффективней было бы применить [[Алгоритм Дейкстры|алгоритм Дейкстры]] для этой же цели, так как у него гораздо лучше асимптотика. Для этого нам надо перевзвесить рёбра графа.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Пусть дана транспортная сеть &amp;lt;tex&amp;gt;\,G(V,E)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; — множество вершин графа, а &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt; — множество рёбер. Введем в каждой вершине потенциал &amp;lt;tex&amp;gt;p(v)&amp;lt;/tex&amp;gt;. Тогда потенциальный вес (то есть стоимость) ребра &amp;lt;tex&amp;gt;(u, v)&amp;lt;/tex&amp;gt; определяется как&lt;br /&gt;
&amp;lt;tex&amp;gt;w_p(u, v) = w(u, v) + p(u) - p(v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
Заметим, что сумма потенциальных весов ребер вдоль любого пути отличается от суммы весов вдоль того же самого пути на разность между потенциалом первой и последней вершины.&lt;br /&gt;
&lt;br /&gt;
== Использование потенциалов Джонсона ==&lt;br /&gt;
Возьмём значения потенциалов в вершинах равными минимальному расстоянию от истока до них, а расстояния найдём с помощью [[Алгоритм Форда-Беллмана|алгоритма Форда-Беллмана]]. Таким образом, нам его придётся запустить всего один раз, а не на каждом шаге алгоритма. Однако, после добавления потока вдоль кратчайшего увеличивающего пути в сети могут появиться новые ребра, равно как и исчезнуть старые, и будет необходимо пересчитать потенциалы, чтобы они оставались корректными, то есть &amp;lt;tex&amp;gt;p(v)&amp;lt;/tex&amp;gt; - длина кратчайшего пути от истока в вершину &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; в новой сети. Научимся делать это, не запуская каждый раз Форда-Беллмана.&lt;br /&gt;
&lt;br /&gt;
Для начала докажем, что в сети с корректными потенциалами &amp;lt;tex&amp;gt;w_p(u, v) = 0&amp;lt;/tex&amp;gt; для любого ребра &amp;lt;tex&amp;gt;(u, v)&amp;lt;/tex&amp;gt;, лежащего на кратчайшем пути из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;s, v_1, v_2, \ldots, v_k, t&amp;lt;/tex&amp;gt; - кратчайший путь из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;d(u, v)&amp;lt;/tex&amp;gt; - длина кратчайшего пути между вершинами &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; в исходной сети без потенциалов. Тогда &amp;lt;tex&amp;gt;w(s, v_1) + w(v_1, v_2) + \ldots + w(v_k, t) = d(s, t)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;w_p(s, v_1) + w_p(v_1, v_2) + \ldots + w_p(v_k, t) = p(s) + w(s, v_1) + w(v_1, v_2) + \ldots + w(v_k, t) - p(t) = p(s) + d(s, t) - p(t) = p(s) + p(t) - p(t) = p(s) = 0&amp;lt;/tex&amp;gt;. Таким образом, сумма всех потенциальных весов ребер на кратчайшем пути из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt; равна нулю. Кроме того, для любого ребра &amp;lt;tex&amp;gt;(u, v)&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;w_p(u, v) \geq 0&amp;lt;/tex&amp;gt;. Следственно, &amp;lt;tex&amp;gt;w_p(u, v) = 0&amp;lt;/tex&amp;gt; для любого ребра &amp;lt;tex&amp;gt;(u, v)&amp;lt;/tex&amp;gt;, лежащего на кратчайшем пути из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Более того, потенциальный вес всех ребер, обратных ребрам из кратчайшего пути, тоже равен &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;. И правда, &amp;lt;tex&amp;gt;w_p(u, v) = w(u, v) + d(s, u) - d(s, v) = 0&amp;lt;/tex&amp;gt;. Умножив на &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt;, получаем &amp;lt;tex&amp;gt;0 = -w(u, v) - d(s, u) + d(s, v) = w(v, u) + d(s, v) - d(s, u) = w_p(v, u)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Из доказанных выше фактов следует, что при добавлении потока вдоль кратчайшего пути в сети с корректными потенциалами не появляется ребер с отрицательным весом (однако сами потенциалы уже становятся некорректными). Но так как ребер отрицательного веса нет, то мы можем пустить алгоритм Дейкстры из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, чтобы насчитать новые потенциалы. Пусть &amp;lt;tex&amp;gt;d_1(u, v)&amp;lt;/tex&amp;gt; - кратчайшее расстояние, найденное алгоритмом Дейкстры, из &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; в сети с появившимися новыми ребрами, но старыми потенциалами, а &amp;lt;tex&amp;gt;d(u, v)&amp;lt;/tex&amp;gt; - кратчайшее расстояние в новой сети без потенциалов. Нетрудно заметить, что &amp;lt;tex&amp;gt;d_1(s, v) = d(s, v) - p(v)&amp;lt;/tex&amp;gt;, следственно, &amp;lt;tex&amp;gt;d(s, v) = d_1(s, v) + p(v)&amp;lt;/tex&amp;gt;. Зная настоящие расстояния от истока до каждой вершины, мы теперь можем проставить новые потенциалы. Для каждой вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;p(v) \gets d(s, v) = d_1(s, v) + p(v)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Кроме того, мы также нашли новый кратчайший путь из истока в сток - а значит, на следующей итерации алгоритма мы можем пустить поток по нему и повторить все заново.&lt;br /&gt;
&lt;br /&gt;
==Реализация==&lt;br /&gt;
Модифицируем псевдокод из статьи про [[Поиск потока минимальной стоимости методом дополнения вдоль путей минимальной стоимости|поиск потока минимальной стоимости методом дополнения вдоль путей минимальной стоимости]]:&lt;br /&gt;
&lt;br /&gt;
 '''for''' &amp;lt;tex&amp;gt;e \in E&amp;lt;/tex&amp;gt; {&lt;br /&gt;
      &amp;lt;tex&amp;gt;f[e] \leftarrow 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
 }&lt;br /&gt;
 Запустим алгоритм Форда-Беллмана, в результате для каждой вершины: &amp;lt;tex&amp;gt;p[v] &amp;lt;/tex&amp;gt; — кратчайшее расстояние &amp;lt;tex&amp;gt;s \leadsto v&amp;lt;/tex&amp;gt;, &lt;br /&gt;
 если за длину ребра принимается его стоимость.&lt;br /&gt;
 '''while''' (существует путь &amp;lt;tex&amp;gt;s \leadsto t&amp;lt;/tex&amp;gt; в остаточной сети &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt;) {&lt;br /&gt;
       Восстановить &amp;lt;tex&amp;gt;P &amp;lt;/tex&amp;gt; — кратчайший в смысле стоимости путь &amp;lt;tex&amp;gt;s \leadsto t&amp;lt;/tex&amp;gt;, найденный на предыдущем шаге&lt;br /&gt;
       дополнить поток &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; вдоль &amp;lt;tex&amp;gt;P&amp;lt;/tex&amp;gt;&lt;br /&gt;
       Запустить алгоритм Дейкстры из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, чтобы насчитать &amp;lt;tex&amp;gt;d_1&amp;lt;/tex&amp;gt;&lt;br /&gt;
       '''for''' &amp;lt;tex&amp;gt;v \in V&amp;lt;/tex&amp;gt; {&lt;br /&gt;
            &amp;lt;tex&amp;gt;p[v] \leftarrow p[v] + d_1[v]&amp;lt;/tex&amp;gt;&lt;br /&gt;
       }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Асимптотика==&lt;br /&gt;
Пусть все пропускные способности целочисленны.&lt;br /&gt;
[[Поиск потока минимальной стоимости методом дополнения вдоль путей минимальной стоимости|Метод целиком]] работает за &amp;lt;tex&amp;gt;O(F(V, E) \cdot |f|)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;F(V, E)&amp;lt;/tex&amp;gt; — время одной итерации.&lt;br /&gt;
&lt;br /&gt;
Время, затраченное на одну итерацию, определяется скоростью поиска кратчайшего пути.&lt;br /&gt;
Если для этой цели использовать [[Алгоритм Дейкстры|алгоритм Дейкстры]] с Фиббоначевыми кучами, то поиск мы осуществим за &amp;lt;tex&amp;gt;O(V \log V + E)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Не стоит так же забывать, что для расчёта потенциалов мы один раз запустили Алгоритм Форда-Беллмана.&lt;br /&gt;
В результате получим время работы &amp;lt;tex&amp;gt;O((V \log V + E) \cdot |f| + V E)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Это лучше, чем &amp;lt;tex&amp;gt;O((V E) \cdot |f|)&amp;lt;/tex&amp;gt;, что получается при использовании [[Алгоритм Форда-Беллмана|алгоритма Форда-Беллмана]] для поиска кратчайшего пути на каждой итерации.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
В применении к [[Сведение задачи о назначениях к задаче о потоке минимальной стоимости|задаче о назначениях]]: пусть у нас есть &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt; назначений. Построим специальным образом граф. Искомый поток в нём имеет имеет мощность &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;. Количество вершин  — &amp;lt;tex&amp;gt;O(N)&amp;lt;/tex&amp;gt;, рёбер — &amp;lt;tex&amp;gt;O(N^2)&amp;lt;/tex&amp;gt;. Итого получаем асимптотику &amp;lt;tex&amp;gt;O(N^2 \log N + 2N^3) = O(N^3)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* ''Andrew V. Goldberg'' An Efficient implementation of a scaling minimum-cost flow algorithm - Journal of Algorithms, 1997&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Задача о потоке минимальной стоимости]]&lt;/div&gt;</summary>
		<author><name>78.30.250.115</name></author>	</entry>

	</feed>