<?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=178.178.19.19&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=178.178.19.19&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/178.178.19.19"/>
		<updated>2026-05-19T16:38:19Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%BE_%D1%81%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8_%D0%BF%D1%80%D0%BE%D1%81%D1%82%D0%BE%D0%B3%D0%BE_%D0%BF%D1%83%D1%82%D0%B8_%D0%B2_%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B5_%D1%81%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D1%83%D1%82%D0%B8&amp;diff=18769</id>
		<title>Теорема о существовании простого пути в случае существования пути</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A2%D0%B5%D0%BE%D1%80%D0%B5%D0%BC%D0%B0_%D0%BE_%D1%81%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8_%D0%BF%D1%80%D0%BE%D1%81%D1%82%D0%BE%D0%B3%D0%BE_%D0%BF%D1%83%D1%82%D0%B8_%D0%B2_%D1%81%D0%BB%D1%83%D1%87%D0%B0%D0%B5_%D1%81%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F_%D0%BF%D1%83%D1%82%D0%B8&amp;diff=18769"/>
				<updated>2012-03-04T12:28:07Z</updated>
		
		<summary type="html">&lt;p&gt;178.178.19.19: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Определения==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Простой (вершинно-простой) путь''' {{---}} путь, в котором каждая из вершин графа встречается не более одного раза.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Реберно-простой путь''' {{---}} путь, в котором каждое из ребер графа встречается не более одного раза.&lt;br /&gt;
}}&lt;br /&gt;
[[Файл:Prostoy put(1).png|thumb|300px|left|Ориентированный граф&amp;lt;br&amp;gt;&amp;lt;font color=#ED1C24&amp;gt;Красным&amp;lt;/font&amp;gt; выделен вершинно-простой путь&amp;lt;br&amp;gt;&amp;lt;font color=#22B14C&amp;gt;Зеленым&amp;lt;/font&amp;gt; реберно-простой путь]]&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Длина пути''' {{---}} количество [[Основные определения теории графов|рёбер]], входящих в последовательность, задающую этот путь.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Теорема о существовании простого пути в случае существования пути==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если между двумя [[Основные определения теории графов|вершинами графа]] существует [[Основные определения теории графов|путь]], то между ними существует простой путь.&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
=== Доказательство построением ===&lt;br /&gt;
&lt;br /&gt;
Возьмём любой из существующих путей между нужными нам вершинами: &amp;lt;tex&amp;gt;v_0e_1v_1e_2v_2 ... e_nv_n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* Алгоритм:&lt;br /&gt;
 1. Для вершины &amp;lt;tex&amp;gt;v_i&amp;lt;/tex&amp;gt; найдём момент её последнего вхождения в путь {{---}} &amp;lt;tex&amp;gt;v_j&amp;lt;/tex&amp;gt;.&lt;br /&gt;
 2. Удалим отрезок пути от &amp;lt;tex&amp;gt;e_{i+1}&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;v_j&amp;lt;/tex&amp;gt;, включительно.&lt;br /&gt;
 Получившаяся последовательность вершин и рёбер графа останется путём от &amp;lt;tex&amp;gt;v_0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;v_n&amp;lt;/tex&amp;gt;, и в нём вершина &amp;lt;tex&amp;gt;v_i&amp;lt;/tex&amp;gt; будет содержаться ровно один раз.&lt;br /&gt;
Начнём процесс с вершины &amp;lt;tex&amp;gt;v_0&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;
Тогда в нём содержатся две одинаковые вершины &amp;lt;tex&amp;gt;v_i = v_j&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;i &amp;lt; j&amp;lt;/tex&amp;gt;. Удалим из исходного пути отрезок от &amp;lt;tex&amp;gt;e_{i+1}&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;v_j&amp;lt;/tex&amp;gt;, включительно. Конечная последовательность также будет путём от &amp;lt;tex&amp;gt;v_0&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;v_n&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;
== См. также ==&lt;br /&gt;
* [[Основные определения теории графов]]&lt;br /&gt;
* [[Теорема о существовании простого цикла в случае существования цикла]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Основные определения теории графов]]&lt;/div&gt;</summary>
		<author><name>178.178.19.19</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D1%83%D0%BD%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%BC%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BF%D0%B0%D1%80%D0%BE%D1%81%D0%BE%D1%87%D0%B5%D1%82%D0%B0%D0%BD%D0%B8%D1%8F&amp;diff=18768</id>
		<title>Обсуждение:Алгоритм Куна для поиска максимального паросочетания</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D1%83%D0%BD%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%BC%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BF%D0%B0%D1%80%D0%BE%D1%81%D0%BE%D1%87%D0%B5%D1%82%D0%B0%D0%BD%D0%B8%D1%8F&amp;diff=18768"/>
				<updated>2012-03-04T11:27:27Z</updated>
		
		<summary type="html">&lt;p&gt;178.178.19.19: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1) :Просматриваем все вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; первой доли графа &amp;lt;tex&amp;gt;u \in V_1&amp;lt;/tex&amp;gt;. Что это?&lt;br /&gt;
&lt;br /&gt;
2) Вынести доказательство корректности в теорему. Нормально доказать.&lt;br /&gt;
&lt;br /&gt;
В целом, тут нужны некоторые небольшие изменения, что бы сделать его более понятным.&lt;/div&gt;</summary>
		<author><name>178.178.19.19</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D1%83%D0%BD%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%BC%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BF%D0%B0%D1%80%D0%BE%D1%81%D0%BE%D1%87%D0%B5%D1%82%D0%B0%D0%BD%D0%B8%D1%8F&amp;diff=18767</id>
		<title>Обсуждение:Алгоритм Куна для поиска максимального паросочетания</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%9A%D1%83%D0%BD%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%BC%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BF%D0%B0%D1%80%D0%BE%D1%81%D0%BE%D1%87%D0%B5%D1%82%D0%B0%D0%BD%D0%B8%D1%8F&amp;diff=18767"/>
				<updated>2012-03-04T11:26:31Z</updated>
		
		<summary type="html">&lt;p&gt;178.178.19.19: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1) :Просматриваем все вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; первой доли графа &amp;lt;tex&amp;gt;u \in V_1&amp;lt;/tex&amp;gt;. Что это?&lt;br /&gt;
2) Вынести доказательство корректности в теорему. Нормально доказать.&lt;br /&gt;
&lt;br /&gt;
В целом, тут нужны некоторые небольшие изменения, что бы сделать его более понятным.&lt;/div&gt;</summary>
		<author><name>178.178.19.19</name></author>	</entry>

	<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%9A%D1%83%D0%BD%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%BC%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BF%D0%B0%D1%80%D0%BE%D1%81%D0%BE%D1%87%D0%B5%D1%82%D0%B0%D0%BD%D0%B8%D1%8F&amp;diff=18766</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%9A%D1%83%D0%BD%D0%B0_%D0%B4%D0%BB%D1%8F_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0_%D0%BC%D0%B0%D0%BA%D1%81%D0%B8%D0%BC%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BF%D0%B0%D1%80%D0%BE%D1%81%D0%BE%D1%87%D0%B5%D1%82%D0%B0%D0%BD%D0%B8%D1%8F&amp;diff=18766"/>
				<updated>2012-03-04T11:02:42Z</updated>
		
		<summary type="html">&lt;p&gt;178.178.19.19: /* Алгоритм */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Теорема==&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
 Если из вершины &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; не существует дополняющей цепи относительно паросочетания &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; и паросочетание &amp;lt;tex&amp;gt;M'&amp;lt;/tex&amp;gt; получается из &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; изменением вдоль дополняющей цепи, тогда из &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; не существует дополняющей цепи в &amp;lt;tex&amp;gt;M'&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:Kuhn2.png|thumb|right|300x300px|Рисунок 1.]]&lt;br /&gt;
[[Файл:Kuhn1.png|thumb|right|300x300px|Рисунок 2.&amp;lt;br&amp;gt;Пунктиром обозначен путь между двумя вершинами. Ребро красного цвета лежит в паросочетании, а черного - нет.]]&lt;br /&gt;
: Доказательство от противного.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
: Допустим в паросочетание внесли изменения вдоль дополняющей цепи &amp;lt;tex&amp;gt;(y \rightsquigarrow z)&amp;lt;/tex&amp;gt; и из вершины &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; появилась дополняющая цепь.&lt;br /&gt;
: Заметим, что эта дополняющая цепь должна вершинно пересекаться с той цепью, вдоль которой вносились изменения, иначе такая же дополняющая цепь из &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; существовала и в исходном паросочетании.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
: Пусть &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; {{---}} ближайшая к &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; вершина, которая принадлежит и новой дополняющей цепи и цепи &amp;lt;tex&amp;gt;(y \rightsquigarrow z)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
: Тогда &amp;lt;tex&amp;gt;MP&amp;lt;/tex&amp;gt; - последнее ребро на отрезке &amp;lt;tex&amp;gt;(y \rightsquigarrow p)&amp;lt;/tex&amp;gt; цепи &amp;lt;tex&amp;gt;(y \rightsquigarrow z)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;NP&amp;lt;/tex&amp;gt; - последнее ребро на отрезке &amp;lt;tex&amp;gt;(z \rightsquigarrow p)&amp;lt;/tex&amp;gt; цепи &amp;lt;tex&amp;gt;(y \rightsquigarrow z)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;QP&amp;lt;/tex&amp;gt; - последнее ребро лежащее на отрезке &amp;lt;tex&amp;gt;(x \rightsquigarrow p)&amp;lt;/tex&amp;gt; новой дополняющей цепи(см. Рисунок 1).&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
: Допустим &amp;lt;tex&amp;gt;MP&amp;lt;/tex&amp;gt; принадлежит паросочетанию &amp;lt;tex&amp;gt;M'&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;NP&amp;lt;/tex&amp;gt; ему не принадлежит.&amp;lt;br&amp;gt;&lt;br /&gt;
:: (Случай, когда &amp;lt;tex&amp;gt;NP&amp;lt;/tex&amp;gt; принадлежит паросочетанию &amp;lt;tex&amp;gt;M'&amp;lt;/tex&amp;gt; полностью симметричен.)&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
: Поскольку паросочетание &amp;lt;tex&amp;gt;M'&amp;lt;/tex&amp;gt; получается из &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; изменением вдоль дополняющей цепи &amp;lt;tex&amp;gt;(y \rightsquigarrow z)&amp;lt;/tex&amp;gt;, в паросочетание &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; входило ребро &amp;lt;tex&amp;gt;NP&amp;lt;/tex&amp;gt;, а ребро &amp;lt;tex&amp;gt;MP&amp;lt;/tex&amp;gt; нет.&lt;br /&gt;
: Кроме того, ребро &amp;lt;tex&amp;gt;QP&amp;lt;/tex&amp;gt; не лежит ни в исходном паросочетании &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt;, ни в паросочетании &amp;lt;tex&amp;gt;M'&amp;lt;/tex&amp;gt;, в противном случае оказалось бы, что вершина &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt; инцидентна нескольким ребрам из паросочетания, что противоречит определению паросочетания.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
:Тогда заметим, что цепь &amp;lt;tex&amp;gt;(x \rightsquigarrow z)&amp;lt;/tex&amp;gt;, полученная объединением цепей &amp;lt;tex&amp;gt;(x \rightsquigarrow p)&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;(p \rightsquigarrow z)&amp;lt;/tex&amp;gt;, по определению будет дополняющей в паросочетании &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt;, что приводит к противоречию, поскольку в паросочетании &amp;lt;tex&amp;gt;M&amp;lt;/tex&amp;gt; из вершины &amp;lt;tex&amp;gt;x&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;
:Задан двудольный граф &amp;lt;tex&amp;gt;G(V, E)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;V_2&amp;lt;/tex&amp;gt; {{---}} его левая и правая доли соответственно. &lt;br /&gt;
:Просматриваем все вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; первой доли графа &amp;lt;tex&amp;gt;u \in V_1&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;v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
:* Просматриваем все рёбра из этой вершины, пусть текущее ребро — &amp;lt;tex&amp;gt;(v, to)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
:* Если вершина &amp;lt;tex&amp;gt;to&amp;lt;/tex&amp;gt; ещё не насыщена паросочетанием, то включаем ребро &amp;lt;tex&amp;gt;(v, to)&amp;lt;/tex&amp;gt; в паросочетание и прекращаем поиск из вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
:* Иначе, если вершина &amp;lt;tex&amp;gt;to&amp;lt;/tex&amp;gt; уже насыщена каким-то ребром &amp;lt;tex&amp;gt;(p, to)&amp;lt;/tex&amp;gt; и не посещена, то просто перейдем в нашем обходе в вершину &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;.&lt;br /&gt;
:** Пробуем найти часть увеличивающей цепи из вершины &amp;lt;tex&amp;gt;p&amp;lt;/tex&amp;gt;.&lt;br /&gt;
:** Если получилось, то удаляем из паросочетания ребро &amp;lt;tex&amp;gt;(p, to)&amp;lt;/tex&amp;gt;, а вместо него добавляем &amp;lt;tex&amp;gt;(v, to)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
: Этот обход, запущенный из вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, либо найдет увеличивающую цепь, и тем самым насытит вершину, либо же такой увеличивающей цепи не найдёт (и, следовательно, эта вершина  уже не сможет стать насыщенной).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: После того, как все вершины &amp;lt;tex&amp;gt;u \in V_1&amp;lt;/tex&amp;gt; будут просмотрены, текущее паросочетание будет максимальным.&lt;br /&gt;
: Корректность алгоритма следует из [[Теорема о максимальном паросочетании и дополняющих цепях|теоремы Бержа]] и теоремы, описанной выше.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Релизация==&lt;br /&gt;
&lt;br /&gt;
: Граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; хранится списками смежности &amp;lt;tex&amp;gt;g[v][i]&amp;lt;/tex&amp;gt;&lt;br /&gt;
: Функция &amp;lt;tex&amp;gt;dfs(v)&amp;lt;/tex&amp;gt; {{---}} обход в глубину, возвращает &amp;lt;tex&amp;gt;true&amp;lt;/tex&amp;gt; если есть увеличивающая цепь из вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;.&lt;br /&gt;
: В массиве &amp;lt;tex&amp;gt;matching&amp;lt;/tex&amp;gt; хранятся паросочетания. Паросочетание есть ребро &amp;lt;tex&amp;gt;(i, matching[i])&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 bool dfs(int v) &lt;br /&gt;
 {&lt;br /&gt;
     if (used[v])&lt;br /&gt;
         return false;&lt;br /&gt;
 &lt;br /&gt;
     used[v] = true;&lt;br /&gt;
     for (int i = 0; i &amp;lt; g[v].size(); i++)&lt;br /&gt;
     {&lt;br /&gt;
         int to = g[v][i];&lt;br /&gt;
         if (matching[to] == -1 || dfs(matching[to]))&lt;br /&gt;
         {&lt;br /&gt;
             matching[to] = v;&lt;br /&gt;
             return true;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
     return false;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
     ... чтение графа ...&lt;br /&gt;
     matching.assign (k, -1);&lt;br /&gt;
     for (int u = 0; u &amp;lt; n; u++)&lt;br /&gt;
     {&lt;br /&gt;
         used.assign(n, false);&lt;br /&gt;
         dfs(u); &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     for (int i = 0; i &amp;lt; k; i++)&lt;br /&gt;
         if (matching[i] != -1)&lt;br /&gt;
             ... вывод ...&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==Время работы==&lt;br /&gt;
:Итак, алгоритм Куна можно представить как серию из  &amp;lt;tex&amp;gt;n_1&amp;lt;/tex&amp;gt; запусков обхода в глубину на всём графе.&lt;br /&gt;
:Следовательно, всего этот алгоритм исполняется за время &amp;lt;tex&amp;gt;O(nm)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;m&amp;lt;/tex&amp;gt; {{---}} количество ребер, что в худшем случае есть &amp;lt;tex&amp;gt;O(n^3)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Более точная оценка:&lt;br /&gt;
:В описанной выше реализации запуски обхода в глубину/ширину происходят только из вершин первой доли, поэтому весь алгоритм исполняется за время &amp;lt;tex&amp;gt;O(n_1m)&amp;lt;/tex&amp;gt; , где &amp;lt;tex&amp;gt;n_1&amp;lt;/tex&amp;gt; — число вершин первой доли. В худшем случае это составляет &amp;lt;tex&amp;gt;O(n_1^2n_2)&amp;lt;/tex&amp;gt;,  где &amp;lt;tex&amp;gt;n_2&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;
==Источники==&lt;br /&gt;
:[http://e-maxx.ru/algo/kuhn_matching MAXimal :: algo :: Алгоритм Куна нахождения наибольшего паросочетания]&amp;lt;br&amp;gt;&lt;br /&gt;
: Асанов М., Баранский В., Расин В. {{---}} Дискретная математика: Графы, матроиды, алгоритмы — СПб.: Издательство &amp;quot;Лань&amp;quot;, 2010. — 291 стр.&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Задача о паросочетании]]&lt;/div&gt;</summary>
		<author><name>178.178.19.19</name></author>	</entry>

	</feed>