<?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=188.170.77.62&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=188.170.77.62&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/188.170.77.62"/>
		<updated>2026-04-09T16:00:39Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A6%D0%B8%D1%80%D0%BA%D1%83%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0&amp;diff=72101</id>
		<title>Циркуляция потока</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A6%D0%B8%D1%80%D0%BA%D1%83%D0%BB%D1%8F%D1%86%D0%B8%D1%8F_%D0%BF%D0%BE%D1%82%D0%BE%D0%BA%D0%B0&amp;diff=72101"/>
				<updated>2020-01-11T17:44:39Z</updated>
		
		<summary type="html">&lt;p&gt;188.170.77.62: wikitex removal&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Поток нулевой величины в [[Определение сети, потока|сети]] $G(V, E)$ называется '''циркуляцией''' (англ. ''circulation problem''). Каждое ребро $e_i$ имеет $l_i$ и $c_i$ {{---}} минимальная и максимальная пропускная способности соответственно. Необходимо выяснить, существует ли в этой сети циркуляция, удовлетворяющая пропускным способностям рёбер. &lt;br /&gt;
}}&lt;br /&gt;
[[Файл:Циркул2.png|frame|справа|Рисунок 1. Пример графа и циркуляции в нем (поток/пропуск.способность)]]&lt;br /&gt;
&lt;br /&gt;
Иначе говоря, [[Определение сети, потока#Определение потока|закон сохранения потока]] &amp;lt;tex&amp;gt;\sum\limits_v f(u,v)=0&amp;lt;/tex&amp;gt; должен выполняться для '''всех''' вершин графа, а значит нет нужды в истоке и стоке. Когда все  $l_i$ равны $0$, достаточно пустить поток нулевой величины из каждой вершины, что и будет ответом. Поэтому далее в графе будут существовать рёбра с положительной нижней пропускной способностью.&lt;br /&gt;
&lt;br /&gt;
==Решение==&lt;br /&gt;
&amp;lt;wikitex&amp;gt;Для решения этой задачи заменим исходную сеть $G$ на $G'$ следующим образом. Сначала добавим в граф вершины $s$ {{---}} исток и $t$ {{---}} сток. Для каждого ребра $e_i = v_{from} \xrightarrow{l_i, c_i} v_{to}$ добавим рёбра $s \xrightarrow{0, l_i} v_{to}$ и $u_{from} \xrightarrow{0, l_i} t$, а также сделаем в ребре $e_i$ изменения: $c_i = c_i - l_i, l_i = 0$ (см. рисунок 2).&lt;br /&gt;
&lt;br /&gt;
[[Файл:Циркуляция.png|frame|center|Рисунок 2. Слева - изначальный граф. Для каждого ребра заданы его нижняя и верхняя пропускные способности. Справа - граф после преобразований рёбер.]]&lt;br /&gt;
&lt;br /&gt;
Каждое ребро изначального графа заменяется на три новых. Если по ребру $e_i = (v_{from}, v_{to})$ в исходной сети протекает поток $l_i \leqslant f_i \leqslant c_i$, то в новой сети по ребру $(s, v_{to})$ должен течь поток, равный $l_i$, то есть его пропускной способности. Поток, который вытекает из $v_{from}$ по ребру в $G$, заменяется на поток, который протекает по рёбрам $(v_{from}, v_{to})$ и $(v_{from}, t)$ (поскольку сумма их пропускных способностей в полученном графе равна $c_i$). Аналогично, для вершины $v_{to}$ суммарный входящий поток не изменился. Таким образом, любой допустимый поток по любому ребру в изначальном графе можно распределить между тремя рёбрами в полученном графе. Заметим, что в сети $G'$ все $l_i = 0$, то есть мы имеем обыкновенную сеть.&lt;br /&gt;
&lt;br /&gt;
Требовалось найти циркуляцию в исходной сети, а значит проверить существование потока, для которого выполнено равенство &amp;lt;tex&amp;gt;\sum\limits_v f(u,v) = 0&amp;lt;/tex&amp;gt; для всех вершин графа. Это равносильно существованию потока между вершинами $s$ и $t$ в сети $G'$, который полностью насытит рёбра, исходящие из истока. Действительно, этот поток в исходном графе насытит $i$-ое ребро как минимум на $l_i$, что и является необходимым требованием. Если этот поток существует, то будет выполнено:&lt;br /&gt;
* $\sum\limits_v f(u,v)=0,$ где $u \in V'-\{s,t\}, v \in V'$, то есть для всех исходных вершин;&lt;br /&gt;
* В $G': f_i \leqslant c_i - l_i \Rightarrow 0 \leqslant f_i \leqslant c_i - l_i \Rightarrow l_i \leqslant f_i + l_i \leqslant c_i$, что удовлетворяет всем ограничениям.&lt;br /&gt;
Значит, этот поток и есть циркуляция. &lt;br /&gt;
&lt;br /&gt;
Запустим в новой сети один из алгоритмов поиска максимального потока. Если он не смог полностью насытить все рёбра из истока, то и никакой другой по величине поток этого сделать не сможет, значит, циркуляции нет. Для получения величин потоков вдоль каждого ребра в изначальной сети достаточно прибавить к потокам вдоль рёбер в сети $G'$ соответствующие значения минимальной пропускной способности.&lt;br /&gt;
&amp;lt;/wikitex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
Конструктор ребра принимает следующие аргументы:&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{from}&amp;lt;/tex&amp;gt; {{---}} вершина начала ребра&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{to}&amp;lt;/tex&amp;gt; {{---}} вершина конца ребра&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{minCap}&amp;lt;/tex&amp;gt; {{---}} минимальная пропускная способность ребра&lt;br /&gt;
* &amp;lt;tex&amp;gt;\mathtt{maxCap}&amp;lt;/tex&amp;gt; {{---}} максимальная пропускная способность ребра&lt;br /&gt;
 '''function''' circulation(&amp;lt;tex&amp;gt;V,E&amp;lt;/tex&amp;gt;):&lt;br /&gt;
     &amp;lt;tex&amp;gt;G'=&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;V \cup s \cup t&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\varnothing&amp;lt;/tex&amp;gt;)                                 &amp;lt;font color=green&amp;gt;// создаём новый граф с исходными вершинами и добавлением s и t {{---}} исток и сток&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' &amp;lt;tex&amp;gt;e : e\in E&amp;lt;/tex&amp;gt;&lt;br /&gt;
         &amp;lt;tex&amp;gt;g&amp;lt;/tex&amp;gt; = Edge(&amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;.to, &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;.minCap)&lt;br /&gt;
         &amp;lt;tex&amp;gt;h&amp;lt;/tex&amp;gt; = Edge(&amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;.from, &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;.to, &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;.maxCap - &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;.minCap)&lt;br /&gt;
         &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; = Edge(&amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;.from, &amp;lt;tex&amp;gt;t&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;.minCap)&lt;br /&gt;
         &amp;lt;tex&amp;gt;G'=G' \cup &amp;lt;/tex&amp;gt;(&amp;lt;tex&amp;gt;\varnothing&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;g \cup h \cup k&amp;lt;/tex&amp;gt;)&lt;br /&gt;
     maxFlow = getMaxFlow(&amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;)                             &amp;lt;font color=green&amp;gt;// наибольший поток в графе G'&amp;lt;/font&amp;gt;&lt;br /&gt;
     '''for''' &amp;lt;tex&amp;gt;e : e\in E'&amp;lt;/tex&amp;gt; '''and''' &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;.from &amp;lt;tex&amp;gt;=s&amp;lt;/tex&amp;gt;&lt;br /&gt;
         '''if''' &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;(&amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;) &amp;lt;tex&amp;gt; &amp;lt; e&amp;lt;/tex&amp;gt;.maxCap                              &amp;lt;font color=green&amp;gt;// если для текущего ребра flow &amp;lt; cap&amp;lt;/font&amp;gt;&lt;br /&gt;
             '''return''' false&lt;br /&gt;
     '''return''' true&lt;br /&gt;
&lt;br /&gt;
==Источники информации==&lt;br /&gt;
* [http://dl.dropbox.com/u/39566886/Graph-Theory-Algorithms-M-Ashraf-Iqbal.pdf M. Ashraf Iqbal {{---}}'''Graph Theory and Algorithms''']&lt;br /&gt;
* [http://e-maxx.ru/algo/flow_with_limits MAXimal :: algo :: flow with limits]&lt;br /&gt;
* [https://en.wikipedia.org/wiki/Circulation_problem Wikipedia — Circulation problem]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория:Задача о максимальном потоке]]&lt;/div&gt;</summary>
		<author><name>188.170.77.62</name></author>	</entry>

	</feed>