<?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=93.92.207.27&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=93.92.207.27&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/93.92.207.27"/>
		<updated>2026-04-11T14:17:52Z</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%A4%D0%BE%D1%80%D0%B4%D0%B0-%D0%A4%D0%B0%D0%BB%D0%BA%D0%B5%D1%80%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%B2_%D0%B3%D0%BB%D1%83%D0%B1%D0%B8%D0%BD%D1%83&amp;diff=61766</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%A4%D0%BE%D1%80%D0%B4%D0%B0-%D0%A4%D0%B0%D0%BB%D0%BA%D0%B5%D1%80%D1%81%D0%BE%D0%BD%D0%B0,_%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%B2_%D0%B3%D0%BB%D1%83%D0%B1%D0%B8%D0%BD%D1%83&amp;diff=61766"/>
				<updated>2017-06-23T18:55:28Z</updated>
		
		<summary type="html">&lt;p&gt;93.92.207.27: /* Оценка производительности */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Алгоритм Форда-Фалкерсона''' — алгоритм, решающий задачу нахождения максимального [[Определение сети, потока #Определение потока | потока]] в транспортной сети.&lt;br /&gt;
&lt;br /&gt;
== Идея ==&lt;br /&gt;
Идея алгоритма заключается в следующем. Изначально величине потока присваивается значение &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt; f(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; V &amp;lt;/tex&amp;gt;. Затем величина потока итеративно увеличивается посредством поиска увеличивающего пути (путь от источника s к стоку t, вдоль которого можно послать ненулевой поток). В данной статье рассматривается алгоритм, осуществляющий этот поиск с помощью [[Обход в глубину, цвета вершин|обхода в глубину (dfs)]]. Процесс повторяется, пока можно найти увеличивающий путь.&lt;br /&gt;
&lt;br /&gt;
== Реализация ==&lt;br /&gt;
 '''int''' dfs('''int''' u, '''int''' Cmin):         &amp;lt;span style=&amp;quot;color:Green&amp;quot;&amp;gt;// Cmin {{---}} пропускная способность в текущем подпотоке&amp;lt;/span&amp;gt;&lt;br /&gt;
    '''if''' (u = t)&lt;br /&gt;
        '''return''' Cmin&lt;br /&gt;
    visited[u] = ''true''                  &lt;br /&gt;
    '''for''' (v '''in''' u.children)&lt;br /&gt;
        '''int''' uv = edge(u, v)&lt;br /&gt;
        '''if''' ('''not''' visited[v]) '''and''' (uv.f &amp;lt; uv.c)&lt;br /&gt;
            '''int''' delta = dfs(v, min(Cmin, uv.c - uv.f))&lt;br /&gt;
            '''if''' (delta &amp;gt; 0)&lt;br /&gt;
                uv.f += delta&lt;br /&gt;
                uv.backEdge.f -= delta&lt;br /&gt;
                '''return''' delta&lt;br /&gt;
    '''return''' 0&lt;br /&gt;
&lt;br /&gt;
== Оценка производительности ==&lt;br /&gt;
Добавляя поток увеличивающего пути к уже имеющемуся потоку, максимальный поток будет получен, когда нельзя будет найти увеличивающий путь. Тем не менее, если величина пропускной способности — иррациональное число, то алгоритм может работать бесконечно. В целых числах таких проблем не возникает и время работы ограничено &amp;lt;tex&amp;gt;O(|E|f)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt; — число рёбер в графе, &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; — максимальный поток в графе, так как каждый увеличивающий путь может быть найден за &amp;lt;tex&amp;gt;O(E)&amp;lt;/tex&amp;gt; и увеличивает поток как минимум на &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Пример несходящегося алгоритма ===&lt;br /&gt;
[[Файл:F-f.5.png|300px|thumb|right|Рис. 1]]&lt;br /&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;\ e_1&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\ e_2&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\ e_3&amp;lt;/tex&amp;gt; соответственно &amp;lt;tex&amp;gt;\ 1&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;r=\dfrac{\sqrt{5}-1}{2}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\ 1&amp;lt;/tex&amp;gt; и пропускной способностью всех остальных рёбер, равной целому числу &amp;lt;tex&amp;gt;M \geqslant 2&amp;lt;/tex&amp;gt;. Константа &amp;lt;tex&amp;gt;\ r&amp;lt;/tex&amp;gt; выбрана так, что &amp;lt;tex&amp;gt;\ r^2 = 1 - r&amp;lt;/tex&amp;gt;. Мы используем пути из остаточного графа, приведённые в таблице, причём &amp;lt;tex&amp;gt;\ p_1 = \{ s, v_4, v_3, v_2, v_1, t \}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\ p_2 = \{ s, v_2, v_3, v_4, t \}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;\ p_3 = \{ s, v_1, v_2, v_3, t \}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align: center&amp;quot;&lt;br /&gt;
! valign=&amp;quot;top&amp;quot; rowspan=2 | Шаг !! valign=&amp;quot;top&amp;quot; rowspan=2 | Найденный путь !! valign=&amp;quot;top&amp;quot; rowspan=2 | Добавленный поток !! colspan=3 | Остаточные пропускные способности&lt;br /&gt;
|-&lt;br /&gt;
! &amp;lt;tex&amp;gt;e_1&amp;lt;/tex&amp;gt; !! &amp;lt;tex&amp;gt;e_2&amp;lt;/tex&amp;gt; !! &amp;lt;tex&amp;gt;e_3&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;-&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;-&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;r^0=1&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;\{ s, v_2, v_3, t \}&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;r^0&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;r^1&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;p_1&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;r^1&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;r^2&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;r^1&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;3&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;p_2&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;r^1&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;r^2&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;r^1&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;4&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;p_1&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;r^2&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;r^3&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;r^2&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;p_3&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;r^2&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;r^2&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;r^3&amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Заметим, что после шага &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, как и после шага &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt;, остаточные способности рёбер &amp;lt;tex&amp;gt;e_1&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;e_2&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e_3&amp;lt;/tex&amp;gt; имеют форму &amp;lt;tex&amp;gt;r^n&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;r^{n+1}&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, соответственно, для какого-то натурального &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;. Это значит, что мы можем использовать увеличивающие пути &amp;lt;tex&amp;gt;p_1&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;p_2&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;p_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;p_3&amp;lt;/tex&amp;gt; бесконечно много раз, и остаточные пропускные способности этих рёбер всегда будут в той же форме. Полный поток после шага &amp;lt;tex&amp;gt;5&amp;lt;/tex&amp;gt; равен &amp;lt;tex&amp;gt;1 + 2(r^1 + r^2)&amp;lt;/tex&amp;gt;. За бесконечное время полный поток сойдётся к &amp;lt;tex&amp;gt;\textstyle 1 + 2\sum\limits_{i=1}^\infty r^i = 3 + 2r&amp;lt;/tex&amp;gt;, тогда как максимальный поток равен &amp;lt;tex&amp;gt;2M + 1&amp;lt;/tex&amp;gt;. Таким образом, алгоритм не только работает бесконечно долго, но даже и не сходится к оптимальному решению.&lt;br /&gt;
&lt;br /&gt;
=== Пример медленной работы алгоритма Форда-Фалкерсона с использованием поиска в глубину по сравнению с реализацией, использующей поиск в ширину ===&lt;br /&gt;
При использовании поиска в ширину алгоритму потребуется всего лишь два шага.&lt;br /&gt;
Дана сеть (Рис. 2).&lt;br /&gt;
[[Файл:F-f.1.png|thumb|300px|center|Рис. 2]]&lt;br /&gt;
Благодаря двум итерациям (Рис. 3 и Рис. 4)&lt;br /&gt;
[[Файл:F-f.2.png|thumb|300px|center|Рис. 3]]&lt;br /&gt;
[[Файл:F-f.3.png|thumb|300px|center|Рис. 4]]&lt;br /&gt;
рёбра &amp;lt;tex&amp;gt;AB, AC, BD, CD&amp;lt;/tex&amp;gt; насытились лишь на &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Конечная сеть будет получена ещё через 1998 итераций (Рис. 5).&lt;br /&gt;
[[Файл:F-f.4.png|thumb|300px|center|Рис. 5]]&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Теорема Форда-Фалкерсона]]&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
* [http://ru.wikipedia.org/wiki/Алгоритм_Форда_—_Фалкерсона Википедия: Алгоритм Форда — Фалкерсона] &amp;lt;br&amp;gt;&lt;br /&gt;
* Томас Х. Кормен и др. Алгоритмы: построение и анализ = INTRODUCTION TO ALGORITHMS. — 2-е изд. — М.: «Вильямс», 2006. — С. 1296. — ISBN 0-07-013151-1&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Задача о максимальном потоке ]]&lt;/div&gt;</summary>
		<author><name>93.92.207.27</name></author>	</entry>

	</feed>