<?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=109.167.138.105&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=109.167.138.105&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/109.167.138.105"/>
		<updated>2026-04-20T21:13:27Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%85%D0%B5%D0%BC%D0%B0_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%94%D0%B8%D0%BD%D0%B8%D1%86%D0%B0&amp;diff=50271</id>
		<title>Схема алгоритма Диница</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%85%D0%B5%D0%BC%D0%B0_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%94%D0%B8%D0%BD%D0%B8%D1%86%D0%B0&amp;diff=50271"/>
				<updated>2015-12-18T10:14:28Z</updated>
		
		<summary type="html">&lt;p&gt;109.167.138.105: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Определение слоистой сети == &lt;br /&gt;
Для начала определим для каждой вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; данной сети &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; длину кратчайшего &amp;lt;tex&amp;gt;s \leadsto v&amp;lt;/tex&amp;gt; пути из истока и обозначим ее &amp;lt;tex&amp;gt;d[v]&amp;lt;/tex&amp;gt; (для этого можно воспользоваться [[Обход в ширину|обходом в ширину]]).&amp;lt;br/&amp;gt; В слоистую сеть включаем только те ребра &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; исходной сети, для которых &amp;lt;tex&amp;gt;d[u] + 1 = d[v]&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Полученная сеть ациклична, и любой &amp;lt;tex&amp;gt;s \leadsto t&amp;lt;/tex&amp;gt; путь в слоистой сети является кратчайшим путём в исходной, из свойств обхода в ширину.&lt;br /&gt;
[[Файл:Слоистая_сеть.png|500px |thumb|center| Слоистая сеть с пятью слоями. s = 0, t = 6]]&lt;br /&gt;
&amp;lt;br/&amp;gt;В примере ребра, обозначенные пунктиром, не входят в слоистую сеть.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Слоистую сеть для графа G будем называть '''вспомогательной сетью'''.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
Пусть дана [[Определение сети, потока | сеть]]. Требуется найти в этой сети [[Определение сети, потока |поток]] &amp;lt;tex&amp;gt;f(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;(u,v)&amp;lt;/tex&amp;gt; данной сети &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; зададим &amp;lt;tex&amp;gt;f(u,v) = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Построим вспомогательную сеть &amp;lt;tex&amp;gt;G_L&amp;lt;/tex&amp;gt; из [[Дополняющая сеть, дополняющий путь|дополняющей сети]] &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt; данного графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;d[t] = \infty&amp;lt;/tex&amp;gt;, остановиться и вывести &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#[[Алгоритм поиска блокирующего потока в ациклической сети|Найдем блокирующий поток]] &amp;lt;tex&amp;gt;f'&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G_L&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Дополним поток &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; найденным потоком &amp;lt;tex&amp;gt;f'&amp;lt;/tex&amp;gt; и перейдем к шагу 2.&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;
|statement=&lt;br /&gt;
Расстояние между истоком и стоком строго увеличивается после каждой фазы алгоритма, т.е. &amp;lt;tex&amp;gt;d'[t] &amp;gt; d[t]&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;d'[t]&amp;lt;/tex&amp;gt; — значение, полученное на следующей фазе алгоритма.&lt;br /&gt;
|proof=&lt;br /&gt;
Проведём доказательство от противного. Пусть длина кратчайшего пути из истока в сток останется неизменной после очередной фазы алгоритма. Вспомогательная сеть строится по остаточной. Из предположения следует, что в остаточной сети будет содержаться только рёбра остаточной сети перед выполнением данной фазы, либо обратные к ним. Из этого получаем, что нашёлся &amp;lt;tex&amp;gt;s \leadsto t&amp;lt;/tex&amp;gt; путь, который не содержит насыщенных рёбер и имеет ту же длину, что и кратчайший путь. Но этот путь должен был быть «заблокирован» блокирующим потоком, чего не произошло. Получили противоречие. Значит длина изменилась.&lt;br /&gt;
}}&lt;br /&gt;
Поскольку длина кратчайшего &amp;lt;tex&amp;gt;s \leadsto t&amp;lt;/tex&amp;gt; пути не может превосходить &amp;lt;tex&amp;gt;n - 1&amp;lt;/tex&amp;gt;, то, следовательно, алгоритм Диница совершает не более &amp;lt;tex&amp;gt;n - 1&amp;lt;/tex&amp;gt; фазы.&lt;br /&gt;
Таким образом, в зависимости от того, каким алгоритмом нахождения блокирующего потока мы пользовались, весь алгоритм Диница может выполняться за &amp;lt;tex&amp;gt;O(VE^2)&amp;lt;/tex&amp;gt; или за &amp;lt;tex&amp;gt;O(V^2E)&amp;lt;/tex&amp;gt;. Также возможно достичь асимптотики &amp;lt;tex&amp;gt;O(VE\log V)&amp;lt;/tex&amp;gt;, если использовать [[Link-Cut_Tree | динамические деревья Слетора и Тарьяна]].&lt;br /&gt;
&lt;br /&gt;
==Реализация==&lt;br /&gt;
В данной реализации не строится вспомогательная сеть &amp;lt;tex&amp;gt;G_L&amp;lt;/tex&amp;gt;, а вычисляются значения &amp;lt;tex&amp;gt;d[u]&amp;lt;/tex&amp;gt; {{---}} кратчайших путей &amp;lt;tex&amp;gt;s \leadsto u&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;c[u][v]&amp;lt;/tex&amp;gt; {{---}} пропускная способность ребра &amp;lt;tex&amp;gt;(uv)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f[u][v]&amp;lt;/tex&amp;gt; {{---}} поток через ребро &amp;lt;tex&amp;gt;(uv)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;p[u]&amp;lt;/tex&amp;gt; {{---}} [[Алгоритм_поиска_блокирующего_потока_в_ациклической_сети#.D0.A3.D0.B4.D0.B0.D0.BB.D1.8F.D1.8E.D1.89.D0.B8.D0.B9_.D0.BE.D0.B1.D1.85.D0.BE.D0.B4 | номер первого неудаленного ребра идущего из u]]&lt;br /&gt;
&lt;br /&gt;
 '''bool''' bfs():&lt;br /&gt;
   заполняем массив d значениями, равными &amp;lt;tex&amp;gt;\infty&amp;lt;/tex&amp;gt;&lt;br /&gt;
   d[s] = 0&lt;br /&gt;
   Q.push(s)&lt;br /&gt;
   '''while''' !Q.isEmpty&lt;br /&gt;
     u = Q.pop()&lt;br /&gt;
     '''for''' &amp;lt;tex&amp;gt;(uv) \in E(G)&amp;lt;/tex&amp;gt;&lt;br /&gt;
       '''if''' f[u][v] &amp;lt; c[u][v] '''and''' d[v] == &amp;lt;tex&amp;gt;\infty&amp;lt;/tex&amp;gt;&lt;br /&gt;
         d[v] = d[u] + 1&lt;br /&gt;
         Q.push(v)&lt;br /&gt;
   '''return''' d[t] != &amp;lt;tex&amp;gt;\infty&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;//поиск блокирующего потока&lt;br /&gt;
 //u - номер вершины&lt;br /&gt;
 //cf - минимальная пропускная способность дополняющей сети на пройденном dfs пути&amp;lt;/font&amp;gt;&lt;br /&gt;
 '''int''' dfs(u, cf):&lt;br /&gt;
   '''if''' u == t '''or''' cf == 0&lt;br /&gt;
     '''return''' cf&lt;br /&gt;
   '''for''' v = p[u] '''to''' &amp;lt;tex&amp;gt;|V(G)| - 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''if''' d[v] == d[u] + 1 &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;//это условие эквивалентно поиску во вспомогательной слоистой сети&amp;lt;/font&amp;gt;&lt;br /&gt;
       cfmin = dfs(v, min(cf, c[u][v] - f[u][v]))&lt;br /&gt;
       '''if''' cfmin != 0&lt;br /&gt;
         f[u][v] += cfmin &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;//насыщаем ребра по пути dfs&amp;lt;/font&amp;gt;&lt;br /&gt;
         f[v][u] -= cfmin&lt;br /&gt;
         '''return''' cfmin&lt;br /&gt;
     p[u]++&lt;br /&gt;
   '''return''' 0&lt;br /&gt;
&lt;br /&gt;
 '''int''' findMaxFlow():&lt;br /&gt;
   maxFlow = 0&lt;br /&gt;
   '''while''' bfs() &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;//пересчитываем d[i], заодно проверяем достижима ли t из s&amp;lt;/font&amp;gt;&lt;br /&gt;
     заполняем p нулями&lt;br /&gt;
     flow = dfs(s, &amp;lt;tex&amp;gt;\infty&amp;lt;/tex&amp;gt;)&lt;br /&gt;
     '''while''' flow != 0&lt;br /&gt;
       maxFlow += flow&lt;br /&gt;
       flow = dfs(s, &amp;lt;tex&amp;gt;\infty&amp;lt;/tex&amp;gt;)&lt;br /&gt;
   '''return''' maxFlow&lt;br /&gt;
== Источники ==&lt;br /&gt;
*[http://www.e-maxx.ru/algo/dinic Алгоритм Диница на e-maxx.ru]&lt;br /&gt;
*[http://ru.wikipedia.org/wiki/Алгоритм_Диница Алгоритм Диница на ru.wikipedia.org]&lt;br /&gt;
*Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — С. 1296. — ISBN 5-8489-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Задача о максимальном потоке ]]&lt;/div&gt;</summary>
		<author><name>109.167.138.105</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%85%D0%B5%D0%BC%D0%B0_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%94%D0%B8%D0%BD%D0%B8%D1%86%D0%B0&amp;diff=50270</id>
		<title>Схема алгоритма Диница</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%85%D0%B5%D0%BC%D0%B0_%D0%B0%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC%D0%B0_%D0%94%D0%B8%D0%BD%D0%B8%D1%86%D0%B0&amp;diff=50270"/>
				<updated>2015-12-18T00:42:39Z</updated>
		
		<summary type="html">&lt;p&gt;109.167.138.105: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Определение слоистой сети == &lt;br /&gt;
Для начала определим для каждой вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; данной сети &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; длину кратчайшего &amp;lt;tex&amp;gt;s \leadsto v&amp;lt;/tex&amp;gt; пути из истока и обозначим ее &amp;lt;tex&amp;gt;d[v]&amp;lt;/tex&amp;gt; (для этого можно воспользоваться [[Обход в ширину|обходом в ширину]]).&amp;lt;br/&amp;gt; В слоистую сеть включаем только те ребра &amp;lt;tex&amp;gt;(u,v)&amp;lt;/tex&amp;gt; исходной сети, для которых &amp;lt;tex&amp;gt;d[u] + 1 = d[v]&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Полученная сеть ациклична, и любой &amp;lt;tex&amp;gt;s \leadsto t&amp;lt;/tex&amp;gt; путь в слоистой сети является кратчайшим путём в исходной, из свойств обхода в ширину.&lt;br /&gt;
[[Файл:Слоистая_сеть.png|500px |thumb|center| Слоистая сеть с пятью слоями. s = 0, t = 6]]&lt;br /&gt;
&amp;lt;br/&amp;gt;В примере ребра, обозначенные пунктиром, не входят в слоистую сеть.&lt;br /&gt;
&amp;lt;br/&amp;gt;&amp;lt;br/&amp;gt;Слоистую сеть для графа G будем называть '''вспомогательной сетью'''.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
Пусть дана [[Определение сети, потока | сеть]]. Требуется найти в этой сети [[Определение сети, потока |поток]] &amp;lt;tex&amp;gt;f(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;(u,v)&amp;lt;/tex&amp;gt; данной сети &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; зададим &amp;lt;tex&amp;gt;f(u,v) = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#Построим вспомогательную сеть &amp;lt;tex&amp;gt;G_L&amp;lt;/tex&amp;gt; из [[Дополняющая сеть, дополняющий путь|дополняющей сети]] &amp;lt;tex&amp;gt;G_f&amp;lt;/tex&amp;gt; данного графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;d[t] = \infty&amp;lt;/tex&amp;gt;, остановиться и вывести &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#[[Алгоритм поиска блокирующего потока в ациклической сети|Найдем блокирующий поток &amp;lt;tex&amp;gt;f'&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;G_L&amp;lt;/tex&amp;gt;]].&lt;br /&gt;
#Дополним поток &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; найденным потоком &amp;lt;tex&amp;gt;f'&amp;lt;/tex&amp;gt; и перейдем к шагу 2.&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;
|statement=&lt;br /&gt;
Расстояние между истоком и стоком строго увеличивается после каждой фазы алгоритма, т.е. &amp;lt;tex&amp;gt;d'[t] &amp;gt; d[t]&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;d'[t]&amp;lt;/tex&amp;gt; — значение, полученное на следующей фазе алгоритма.&lt;br /&gt;
|proof=&lt;br /&gt;
Проведём доказательство от противного. Пусть длина кратчайшего пути из истока в сток останется неизменной после очередной фазы алгоритма. Вспомогательная сеть строится по остаточной. Из предположения следует, что в остаточной сети будет содержаться только рёбра остаточной сети перед выполнением данной фазы, либо обратные к ним. Из этого получаем, что нашёлся &amp;lt;tex&amp;gt;s \leadsto t&amp;lt;/tex&amp;gt; путь, который не содержит насыщенных рёбер и имеет ту же длину, что и кратчайший путь. Но этот путь должен был быть «заблокирован» блокирующим потоком, чего не произошло. Получили противоречие. Значит длина изменилась.&lt;br /&gt;
}}&lt;br /&gt;
Поскольку длина кратчайшего &amp;lt;tex&amp;gt;s \leadsto t&amp;lt;/tex&amp;gt; пути не может превосходить &amp;lt;tex&amp;gt;n - 1&amp;lt;/tex&amp;gt;, то, следовательно, алгоритм Диница совершает не более &amp;lt;tex&amp;gt;n - 1&amp;lt;/tex&amp;gt; фазы.&lt;br /&gt;
Таким образом, в зависимости от того, каким алгоритмом нахождения блокирующего потока мы пользовались, весь алгоритм Диница может выполняться за &amp;lt;tex&amp;gt;O(VE^2)&amp;lt;/tex&amp;gt; или за &amp;lt;tex&amp;gt;O(V^2E)&amp;lt;/tex&amp;gt;. Также возможно достичь асимптотики &amp;lt;tex&amp;gt;O(VE\log V)&amp;lt;/tex&amp;gt;, если использовать [[Link-Cut_Tree | динамические деревья Слетора и Тарьяна]].&lt;br /&gt;
&lt;br /&gt;
==Реализация==&lt;br /&gt;
В данной реализации не строится вспомогательная сеть &amp;lt;tex&amp;gt;G_L&amp;lt;/tex&amp;gt;, а вычисляются значения &amp;lt;tex&amp;gt;d[u]&amp;lt;/tex&amp;gt; {{---}} кратчайших путей &amp;lt;tex&amp;gt;s \leadsto u&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;c[u][v]&amp;lt;/tex&amp;gt; {{---}} пропускная способность ребра &amp;lt;tex&amp;gt;(uv)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f[u][v]&amp;lt;/tex&amp;gt; {{---}} поток через ребро &amp;lt;tex&amp;gt;(uv)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''bool''' bfs():&lt;br /&gt;
   заполняем массив d значениями, равными -1&lt;br /&gt;
   Q.push(s)&lt;br /&gt;
   '''while''' !Q.isEmpty&lt;br /&gt;
     u = Q.pop()&lt;br /&gt;
     '''for''' &amp;lt;tex&amp;gt;(uv) \in E(G)&amp;lt;/tex&amp;gt;&lt;br /&gt;
       '''if''' f[u][v] &amp;lt; c[u][v] and d[v] != -1&lt;br /&gt;
         d[v] = d[u] + 1&lt;br /&gt;
         Q.push(v)&lt;br /&gt;
   '''return''' d[t] != -1&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;//поиск блокирующего потока&lt;br /&gt;
 //v - номер вершины&lt;br /&gt;
 //cf - минимальная пропускная способность дополняющей сети на пройденном dfs пути&amp;lt;/font&amp;gt;&lt;br /&gt;
 '''int''' dfs(u, cf):&lt;br /&gt;
   '''if''' u == t '''or''' cf == 0&lt;br /&gt;
     '''return''' cf&lt;br /&gt;
   &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;//p[u] - номер вершины на которой завершился обход для вершины u&amp;lt;/font&amp;gt;&lt;br /&gt;
   '''for''' v = p[u] '''to''' &amp;lt;tex&amp;gt;|V(G)| - 1&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''if''' d[v] == d[u] + 1 &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;//это условие эквивалентно поиску во вспомогательной слоистой сети&amp;lt;/font&amp;gt;&lt;br /&gt;
       cfmin = dfs(v, min(cf, c[u][v] - f[u][v]))&lt;br /&gt;
       f[u][v] += cfmin&lt;br /&gt;
       f[v][u] -= cfmin&lt;br /&gt;
       '''return''' cfmin&lt;br /&gt;
     p[u]++&lt;br /&gt;
   '''return''' 0&lt;br /&gt;
&lt;br /&gt;
 '''int''' findMaxFlow():&lt;br /&gt;
   maxFlow = 0&lt;br /&gt;
   '''while''' bfs() &amp;lt;font color=&amp;quot;darkgreen&amp;quot;&amp;gt;//пересчитываем d[i], заодно проверяем достижима ли t из s&amp;lt;/font&amp;gt;&lt;br /&gt;
     заполняем p нулями&lt;br /&gt;
     flow = dfs(s, &amp;lt;tex&amp;gt;\infty&amp;lt;/tex&amp;gt;)&lt;br /&gt;
     '''while''' flow != 0&lt;br /&gt;
       maxFlow += flow&lt;br /&gt;
       flow = dfs(s, &amp;lt;tex&amp;gt;\infty&amp;lt;/tex&amp;gt;)&lt;br /&gt;
   '''return''' maxFlow&lt;br /&gt;
== Источники ==&lt;br /&gt;
*[http://www.e-maxx.ru/algo/dinic Алгоритм Диница на e-maxx.ru]&lt;br /&gt;
*[http://ru.wikipedia.org/wiki/Алгоритм_Диница Алгоритм Диница на ru.wikipedia.org]&lt;br /&gt;
*Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — С. 1296. — ISBN 5-8489-0857-4&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Задача о максимальном потоке ]]&lt;/div&gt;</summary>
		<author><name>109.167.138.105</name></author>	</entry>

	</feed>