<?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=91.211.52.236&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=91.211.52.236&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/91.211.52.236"/>
		<updated>2026-05-12T20:59:35Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%AD%D0%B4%D0%BC%D0%BE%D0%BD%D0%B4%D1%81%D0%B0-%D0%9A%D0%B0%D1%80%D0%BF%D0%B0&amp;diff=44802</id>
		<title>Алгоритм Эдмондса-Карпа</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%AD%D0%B4%D0%BC%D0%BE%D0%BD%D0%B4%D1%81%D0%B0-%D0%9A%D0%B0%D1%80%D0%BF%D0%B0&amp;diff=44802"/>
				<updated>2015-02-06T06:19:20Z</updated>
		
		<summary type="html">&lt;p&gt;91.211.52.236: /* Оценка быстродействия */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Алгоритм ==&lt;br /&gt;
&lt;br /&gt;
Для заданной сети &amp;lt;tex&amp;gt;G(V, E, c)&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;O(V E^2)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
&lt;br /&gt;
 '''Edmonds_Karp''' (G, s, t)&lt;br /&gt;
     '''for''' (для) каждого ребра &amp;lt;tex&amp;gt;(u,v) \in E[G]&amp;lt;/tex&amp;gt;&lt;br /&gt;
         '''do''' &amp;lt;tex&amp;gt;f[u,v] \leftarrow 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
            &amp;lt;tex&amp;gt;f[v,u] \leftarrow 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''while''' существует ''кратчайший'' путь &amp;lt;tex&amp;gt;p&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;G_f&amp;lt;/tex&amp;gt;&lt;br /&gt;
         '''do''' &amp;lt;tex&amp;gt;c_f(p) \leftarrow min\{c_f(u,v) : (u,v) \in p\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
             '''for''' (для) каждого ребра &amp;lt;tex&amp;gt;(u,v) \in p&amp;lt;/tex&amp;gt;&lt;br /&gt;
                 '''do''' &amp;lt;tex&amp;gt;f[u,v] \leftarrow f[u,v] + c_f(p)&amp;lt;/tex&amp;gt;&lt;br /&gt;
                    &amp;lt;tex&amp;gt;f[v,u] \leftarrow -f[u,v]&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Корректность алгоритма Эдмондса-Карпа ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм Эдмондса-Карпа является реализацией метода [[Алгоритм Форда-Фалкерсона для поиска максимального паросочетания|Форда-Фалкерсона]]. На каждой итерации цикла '''while''' поток в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; увеличивается вдоль одного из кратчайших путей в &amp;lt;tex&amp;gt;G_f&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;s \leadsto t&amp;lt;/tex&amp;gt; путь в &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt;. Если в &amp;lt;tex&amp;gt;G_f&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;s \leadsto t&amp;lt;/tex&amp;gt; пути в &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt; следовательно по [[Теорема Форда-Фалкерсона|теореме Форда-Фалкерсона]] найденный поток &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; максимальный.&lt;br /&gt;
&lt;br /&gt;
== Оценка быстродействия ==&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|id=lemma1&lt;br /&gt;
|statement=&lt;br /&gt;
Если в сети &amp;lt;tex&amp;gt;G(V,E)&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;s \leadsto t&amp;lt;/tex&amp;gt; путей в &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt;, то для всех вершин &amp;lt;tex&amp;gt;v \in V\backslash\{s,t\}&amp;lt;/tex&amp;gt; длина кратчайшего пути &amp;lt;tex&amp;gt;\delta_f(s, v)&amp;lt;/tex&amp;gt; в остаточной сети &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt; не убывает после каждого увеличения потока.&lt;br /&gt;
|proof=&lt;br /&gt;
Предположим противное, пусть существует вершина &amp;lt;tex&amp;gt;v \in V \backslash\{s,t\}&amp;lt;/tex&amp;gt;, что после какого-то увеличения потока длина кратчайшего пути из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; уменьшилась. Обозначим потоки до и после увеличения соответственно за &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;f'&amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; {{---}} вершина, расстояние &amp;lt;tex&amp;gt;\delta'_f(s,v)&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; до которой минимально и уменьшилось с увеличением потока. Имеем &amp;lt;tex&amp;gt;\delta'_f(s,v) &amp;lt; \delta_f(s,v)&amp;lt;/tex&amp;gt;. Рассмотрим путь &amp;lt;tex&amp;gt;p = s \leadsto u \rightarrow v&amp;lt;/tex&amp;gt;, являющийся кратчайшим от &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; к &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G'_f&amp;lt;/tex&amp;gt;. Тогда верно, что &amp;lt;tex&amp;gt;\delta'_f(s, u) = \delta'_f(s,v) - 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
По выбору &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; и из предыдущего утверждения получаем, что &amp;lt;tex&amp;gt;\delta'_f (s, u) \ge \delta_f(s,u)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Предположим &amp;lt;tex&amp;gt;(u, v) \in E_f&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;\delta_f(s,v) \le \delta_f(s, u) + 1 \le \delta'_f(s,u) + 1 = \delta'_f(s, v)&amp;lt;/tex&amp;gt;. Это противоречит &amp;lt;tex&amp;gt;\delta'_f(s,v) &amp;lt; \delta_f(s,v)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;(u,v) \notin E_f&amp;lt;/tex&amp;gt;, но известно, что &amp;lt;tex&amp;gt;(u,v) \in E_f'&amp;lt;/tex&amp;gt;. Появление ребра &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; после увеличения потока означает увеличение потока по обратному ребру &amp;lt;tex&amp;gt;(v, u)&amp;lt;/tex&amp;gt;. Увеличение потока производится вдоль кратчайшего пути, поэтому кратчайший путь из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; вдоль которого происходило увеличения выглядит как &amp;lt;tex&amp;gt;s \leadsto v \rightarrow u&amp;lt;/tex&amp;gt;, из чего получаем &amp;lt;tex&amp;gt;\delta_f(s, v) = \delta_f(s, u) - 1 \le \delta'_f(s, u) - 1 = \delta'(s, v) - 2&amp;lt;/tex&amp;gt;. Данное утверждение противоречит &amp;lt;tex&amp;gt;\delta'_f(s,v) &amp;lt; \delta_f(s,v)&amp;lt;/tex&amp;gt;. Итак мы пришли к противоречию с существованием вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, кратчайшее расстояние до которой уменьшилось с увеличением потока.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Опираясь на предшествующую лемму, докажем следующую теорему, которая ограничивает сверху число итераций цикла '''while''' в алгоритме Эдмондса-Карпа.&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=Пусть для некоторой сети &amp;lt;tex&amp;gt;G(V,E)&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; выполняется алгоритм Эдмондса-Карпа, тогда общее число итераций цикла '''while''' составляет &amp;lt;tex&amp;gt;O(V E)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим множество ребер &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; остаточной сети &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt;, принадлежащих увеличивающему пути &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;, таких что &amp;lt;tex&amp;gt;c_f(p) = c_f(u,v)&amp;lt;/tex&amp;gt;. Назовем данные ребра критическими. Покажем, что каждое из &amp;lt;tex&amp;gt;|E|&amp;lt;/tex&amp;gt; ребер может становиться критическим не более, чем &amp;lt;tex&amp;gt;|V| - 1&amp;lt;/tex&amp;gt; раз. Заметим, что после увеличения потока вдоль пути &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; все критические ребра исчезают из остаточной сети, кроме того по определению остаточной пропускной способности пути хотя бы одно ребро увеличивающего пути {{---}} критическое.&lt;br /&gt;
&lt;br /&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;V&amp;lt;/tex&amp;gt;, соединенные некоторым ребром из &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt;. Увеличение производится вдоль кратчайших путей, поэтому если ребро &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; становиться критическим в первый раз, верно, что &amp;lt;tex&amp;gt;\delta_f(s,v) = \delta_f(s,u) + 1&amp;lt;/tex&amp;gt;. После увеличения потока ребро &amp;lt;tex&amp;gt;(u, v)&amp;lt;/tex&amp;gt; исчезает из сети. Оно не появится в другом увеличивающем пути до тех, пор пока не будет уменьшен по обратному ребру &amp;lt;tex&amp;gt;(v, u)&amp;lt;/tex&amp;gt;. Это может произойти только в том случае, если ребро &amp;lt;tex&amp;gt;(v, u)&amp;lt;/tex&amp;gt; встретится на некотором увеличивающем пути. Пусть в момент перед увеличением поток в сети &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; составлял &amp;lt;tex&amp;gt;f'&amp;lt;/tex&amp;gt;, то поскольку увеличение производиться вдоль кратчайших путей, верно: &amp;lt;tex&amp;gt;\delta'_f(s,u) = \delta'_f(s, v) + 1&amp;lt;/tex&amp;gt;. Согласно [[#lemma1|лемме]] &amp;lt;tex&amp;gt;\delta_f(s,v) \le \delta'_f(s,v)&amp;lt;/tex&amp;gt;, откуда &amp;lt;tex&amp;gt;\delta'_f(s,u) = \delta'(s,v) + 1 \ge \delta_f(s,v) + 1 = \delta_f(s,u) + 2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&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;u&amp;lt;/tex&amp;gt; увеличивается минимум на &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;. Расстояние &amp;lt;tex&amp;gt;\delta(s,u)&amp;lt;/tex&amp;gt; в начальный момент времени больше либо равно &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;. Среди промежуточных вершин на кратчайшем пути &amp;lt;tex&amp;gt;s \leadsto u&amp;lt;/tex&amp;gt; не могут находиться &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;. Следовательно к тому моменту, когда вершина &amp;lt;tex&amp;gt;u&amp;lt;/tex&amp;gt; станет недостижимой из источника расстояние до нее не превысит &amp;lt;tex&amp;gt;|V| - 2&amp;lt;/tex&amp;gt;. Получаем, что ребро &amp;lt;tex&amp;gt;(u, v)&amp;lt;/tex&amp;gt; могло стать критическим не более &amp;lt;tex&amp;gt;(|V| -2)/2 = |V|/2 - 1&amp;lt;/tex&amp;gt; раз. Поскольку в графе не более &amp;lt;tex&amp;gt;O(E)&amp;lt;/tex&amp;gt; пар вершин, между которыми могут существовать ребра в остаточной сети, то общее количество критических ребер в ходе выполнения алгоритма Эдмондса-Карпа равно &amp;lt;tex&amp;gt;O(V E)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Так как каждый увеличивающий путь содержит по крайней мере одно критическое ребро, следовательно число кратчайших путей составляет &amp;lt;tex&amp;gt;O(V E)&amp;lt;/tex&amp;gt;. На каждой итерации цикла '''while''' рассматривается ровно один увеличивающий путь, а поскольку в случае отсутствия такого пути выполнение цикла прерывается, то число итераций цикла '''while''' также составляет &amp;lt;tex&amp;gt;O(V E)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Если увеличивающий путь находить поиском в ширину, то каждую итерацию цикла '''while''' можно выполнить за время &amp;lt;tex&amp;gt;O(E)&amp;lt;/tex&amp;gt;. Инициализация в процедуре '''Edmonds_Karp''' производится за &amp;lt;tex&amp;gt;O(E)&amp;lt;/tex&amp;gt;, следовательно время работы алгоритма алгоритма Эдмондса-Карпа составляет &amp;lt;tex&amp;gt;O(V E^2)&amp;lt;/tex&amp;gt;. Заметим также, что сущетсвует сеть [http://community.topcoder.com/tc?module=Static&amp;amp;d1=tutorials&amp;amp;d2=maxFlowRevisited &amp;quot;грибок&amp;quot;] на которой нижняя граница времени работы алгоритмы Эдмондса-Карпа также составляет &amp;lt;tex&amp;gt;\Omega(V E^2)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* ''Кормен, Томас Х., Лейзерсон, Чарльз И., Ривест, Рональд Л., Штайн Клиффорд'' '''Алгоритмы: построение и анализ''', 2-е издание. Пер. с англ. — М.:Издательский дом &amp;quot;Вильямс&amp;quot;, 2010. — 1296 с.: ил. — Парал. тит. англ. — ISBN 978-5-8459-0857-5 (рус.)&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Задача о максимальном потоке]]&lt;/div&gt;</summary>
		<author><name>91.211.52.236</name></author>	</entry>

	</feed>