<?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=Chuprikov+Pavel</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=Chuprikov+Pavel"/>
		<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/Chuprikov_Pavel"/>
		<updated>2026-06-08T19:36:27Z</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%A0%D0%B5%D0%B4%D0%B5%D0%B8-%D0%9A%D0%B0%D0%BC%D0%B8%D0%BE%D0%BD%D0%B0&amp;diff=18524</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%A0%D0%B5%D0%B4%D0%B5%D0%B8-%D0%9A%D0%B0%D0%BC%D0%B8%D0%BE%D0%BD%D0%B0&amp;diff=18524"/>
				<updated>2012-02-29T07:27:46Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
Редеи-Камиона (для пути)&lt;br /&gt;
|statement=&lt;br /&gt;
В любом [[Турниры|турнире]] есть [[Гамильтоновы_графы#.D0.9E.D1.81.D0.BD.D0.BE.D0.B2.D0.BD.D1.8B.D0.B5_.D0.BE.D0.BF.D1.80.D0.B5.D0.B4.D0.B5.D0.BB.D0.B5.D0.BD.D0.B8.D1.8F|гамильтонов путь]].&lt;br /&gt;
|proof= &lt;br /&gt;
Приведем доказательство по индукции по числу вершин в графе. Пусть &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; {{---}} количество вершин в графе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; ''База  индукции:'' &amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, для &amp;lt;tex&amp;gt; n = 3 &amp;lt;/tex&amp;gt; утверждение верно.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; ''Индукционный переход:'' &amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть предположение верно для всех турниров с количеством вершин не более &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;. Рассмотрим турнир &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt; n + 1 &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; T &amp;lt;/tex&amp;gt;.  Тогда турнир &amp;lt;tex&amp;gt; T - u &amp;lt;/tex&amp;gt; имеет &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; вершин, значит, в нем есть гамильтонов путь &amp;lt;tex&amp;gt; P: (v_1 \rightarrow v_2 \rightarrow \ldots \rightarrow v_n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
[[Файл: Redei_kamion_3.png|250px|thumb|center]]&lt;br /&gt;
 &lt;br /&gt;
Одно из ребер &amp;lt;tex&amp;gt; (u, v_1) &amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt; (v_1, u) &amp;lt;/tex&amp;gt; обязательно содержится в &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Если ребро &amp;lt;tex&amp;gt; (u, v_1) \in ET &amp;lt;/tex&amp;gt;, то путь &amp;lt;tex&amp;gt; (u \rightarrow P) &amp;lt;/tex&amp;gt; - гамильтонов.&lt;br /&gt;
[[Файл: Redei_kamion_4.png|250px|thumb|center|&amp;lt;font color=#ED1C24&amp;gt;Красным&amp;lt;/font&amp;gt; цветом выделен искомый путь]]&lt;br /&gt;
&lt;br /&gt;
Пусть теперь ребро &amp;lt;tex&amp;gt; (u, v_1) \notin ET, v_i &amp;lt;/tex&amp;gt; - первая вершина пути &amp;lt;tex&amp;gt; P &amp;lt;/tex&amp;gt;,  для которой ребро &amp;lt;tex&amp;gt; (u, v_i) \in T &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Если такая вершина существует, то в &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; существует ребро &amp;lt;tex&amp;gt; (v_{i - 1}, u) &amp;lt;/tex&amp;gt; и путь &amp;lt;tex&amp;gt; (v_1 \rightarrow \ldots \rightarrow v_{i - 1} \rightarrow u \rightarrow v_i \rightarrow \ldots v_n) &amp;lt;/tex&amp;gt; – гамильтонов.&lt;br /&gt;
[[Файл: Redei_kamion_5.png|250px|thumb|center|&amp;lt;font color=#ED1C24&amp;gt;Красным&amp;lt;/font&amp;gt; цветом выделен искомый путь]]&lt;br /&gt;
&lt;br /&gt;
Если такой вершины не существует, то путь &amp;lt;tex&amp;gt; (P \rightarrow u) &amp;lt;/tex&amp;gt; - гамильтонов.&lt;br /&gt;
[[Файл: Redei_kamion_6.png|250px|thumb|center|&amp;lt;font color=#ED1C24&amp;gt;Красным&amp;lt;/font&amp;gt; цветом выделен искомый путь]]&lt;br /&gt;
&lt;br /&gt;
Значит, в любом случае в турнире существует гамильтонов путь, q.e.d.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
Редеи-Камиона (для цикла)&lt;br /&gt;
|statement=&lt;br /&gt;
В любом [[Отношение_связности,_компоненты_связности#.D0.A1.D0.B8.D0.BB.D1.8C.D0.BD.D0.B0.D1.8F_.D1.81.D0.B2.D1.8F.D0.B7.D0.BD.D0.BE.D1.81.D1.82.D1.8C|сильно связанном]] турнире есть [[Гамильтоновы_графы#.D0.9E.D1.81.D0.BD.D0.BE.D0.B2.D0.BD.D1.8B.D0.B5_.D0.BE.D0.BF.D1.80.D0.B5.D0.B4.D0.B5.D0.BB.D0.B5.D0.BD.D0.B8.D1.8F|гамильтонов цикл]].&lt;br /&gt;
|proof= &lt;br /&gt;
Приведем доказательство по индукции по числу вершин в цикле. Пусть &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; - количество вершин в графе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; ''База  индукции:'' &amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Cильно связанный турнир &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt; n \geq 3 &amp;lt;/tex&amp;gt; вершин содержит [[Основные_определения_теории_графов#.D0.9E.D1.80.D0.B8.D0.B5.D0.BD.D1.82.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.BD.D1.8B.D0.B5_.D0.B3.D1.80.D0.B0.D1.84.D1.8B|цикл]] длины &amp;lt;tex&amp;gt; 3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&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; VT - u &amp;lt;/tex&amp;gt; распадается на &amp;lt;tex&amp;gt; 2 &amp;lt;/tex&amp;gt; непересекающихся множества:&lt;br /&gt;
* &amp;lt;tex&amp;gt; V_1 = \{ v_1 \in VT | (v_1, u) \in ET \} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
* &amp;lt;tex&amp;gt; V_2 = \{ v_2 \in VT | (u, v_2) \in ET \} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
[[Файл: Redei_kamion_1.png|250px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; сильно связен, следовательно:&lt;br /&gt;
# &amp;lt;tex&amp;gt; V_1 \neq \emptyset &amp;lt;/tex&amp;gt;, (иначе &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; - исток турнира)&lt;br /&gt;
# &amp;lt;tex&amp;gt; V_2 \neq \emptyset &amp;lt;/tex&amp;gt;, (иначе &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; - сток турнира)&lt;br /&gt;
# &amp;lt;tex&amp;gt; \exists e = (w_2, w_1) \in ET &amp;lt;/tex&amp;gt;, (иначе нет пути из &amp;lt;tex&amp;gt;V_2&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;V_1&amp;lt;/tex&amp;gt;):&lt;br /&gt;
#* &amp;lt;tex&amp;gt; w_1 \in V_1 &amp;lt;/tex&amp;gt;,&lt;br /&gt;
#* &amp;lt;tex&amp;gt; w_2 \in V_2 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
[[Файл: Redei_kamion_2.png|250px|thumb|center|&amp;lt;font color=#ED1C24&amp;gt;Красным&amp;lt;/font&amp;gt; цветом выделен цикл длины &amp;lt;tex&amp;gt; 3 &amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Цикл &amp;lt;tex&amp;gt; S_3: (u \rightarrow w_2 \rightarrow w_1 \rightarrow u) &amp;lt;/tex&amp;gt; - искомый цикл длины &amp;lt;tex&amp;gt; 3 &amp;lt;/tex&amp;gt;, q.e.d.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; ''Индукционный переход:'' &amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Если сильно связанный турнир &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt; n \geq 3 &amp;lt;/tex&amp;gt; вершин содержит цикл &amp;lt;tex&amp;gt; S_k &amp;lt;/tex&amp;gt; длины &amp;lt;tex&amp;gt; k, (k &amp;lt; n)&amp;lt;/tex&amp;gt;, то он содержит и цикл длины &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; S_k = (v_1 \rightarrow v_2 \rightarrow \ldots \rightarrow v_k \rightarrow v_1) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; v_0 : v_0 \notin S_k &amp;lt;/tex&amp;gt; и верно, что &amp;lt;tex&amp;gt; \exists u, w \in S_k &amp;lt;/tex&amp;gt;:&lt;br /&gt;
* &amp;lt;tex&amp;gt; (v_0, u) \in ET &amp;lt;/tex&amp;gt;,&lt;br /&gt;
* &amp;lt;tex&amp;gt; (w, v_0) \in ET &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим два случая:&lt;br /&gt;
# существует такая вершина &amp;lt;tex&amp;gt; v_0 &amp;lt;/tex&amp;gt;,&lt;br /&gt;
# не существует такой вершины &amp;lt;tex&amp;gt; v_0 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Заметим, что при &amp;lt;tex&amp;gt;k = n - 1&amp;lt;/tex&amp;gt; такая вершина необходимо существует, так как иначе вершина, не входящая в цикл, будет являться либо стоком, либо истоком.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Первый случай: &amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; v_1 &amp;lt;/tex&amp;gt; - вершина из &amp;lt;tex&amp;gt; S_k &amp;lt;/tex&amp;gt; такая, что ребро &amp;lt;tex&amp;gt; e = (v_1, v_0 ) \in ET &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; v_i &amp;lt;/tex&amp;gt; – первая вершина при обходе &amp;lt;tex&amp;gt; S_k &amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt; v_1 &amp;lt;/tex&amp;gt;, для которой ребро &amp;lt;tex&amp;gt; f = (v_0, v_i ) \in ET &amp;lt;/tex&amp;gt;.&lt;br /&gt;
[[Файл: Redei_kamion_7.png|250px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Тогда ребро &amp;lt;tex&amp;gt; g = (v_{i - 1}, v_0) \in ET &amp;lt;/tex&amp;gt;.&lt;br /&gt;
[[Файл: Redei_kamion_8.png|250px|thumb|center|&amp;lt;font color=#ED1C24&amp;gt;Красным&amp;lt;/font&amp;gt; цветом выделен искомый цикл длины &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt; ]]&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt; S_{k + 1} = (v_1 \rightarrow v_2 \rightarrow \ldots \rightarrow v_{i - 1} \rightarrow v_0 \rightarrow v_i \rightarrow \ldots \rightarrow v_k \rightarrow v_1) &amp;lt;/tex&amp;gt; – искомый цикл длины &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Второй случай: &amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть:&lt;br /&gt;
* &amp;lt;tex&amp;gt; V_1 = \{ u \in VT | u \notin S_k, e = (u, v_i) \in ET, \forall i = \overline{1, n} \} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
* &amp;lt;tex&amp;gt; V_2 = \{ u \in VT | u \notin S_k, f = (v_i, u) \in ET, \forall i = \overline{1, n} \} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt; V_1 \cap V_2 = \emptyset &amp;lt;/tex&amp;gt;.&lt;br /&gt;
[[Файл: Redei_kamion_9.png|250px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Турнир сильно связен, следовательно:&lt;br /&gt;
* &amp;lt;tex&amp;gt; V_1 \neq \emptyset &amp;lt;/tex&amp;gt;, (иначе &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; не будет сильно связным, так как тогда нет простых путей с началом в &amp;lt;tex&amp;gt; V_2 &amp;lt;/tex&amp;gt; и концом в &amp;lt;tex&amp;gt; {v_1, \ldots, v_k} &amp;lt;/tex&amp;gt;)&lt;br /&gt;
* &amp;lt;tex&amp;gt; V_2 \neq \emptyset &amp;lt;/tex&amp;gt;, (иначе &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; не будет сильно связным, так как тогда нет простых путей с началом в &amp;lt;tex&amp;gt; {v_1, \ldots, v_k} &amp;lt;/tex&amp;gt; и концом в &amp;lt;tex&amp;gt; V_1 &amp;lt;/tex&amp;gt;)&lt;br /&gt;
* &amp;lt;tex&amp;gt; \exists g = (w_2, w_1) \in ET &amp;lt;/tex&amp;gt;, (иначе &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; не будет сильно связным, так как тогда нет простых путей с началом в &amp;lt;tex&amp;gt;V_2&amp;lt;/tex&amp;gt; и концом в &amp;lt;tex&amp;gt;V_1&amp;lt;/tex&amp;gt;):&lt;br /&gt;
** &amp;lt;tex&amp;gt; w_1 \in V_1 &amp;lt;/tex&amp;gt;,&lt;br /&gt;
** &amp;lt;tex&amp;gt; w_2 \in V_2 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
[[Файл: Redei_kamion_10.png|250px|thumb|center|&amp;lt;font color=#ED1C24&amp;gt;Красным&amp;lt;/font&amp;gt; цветом выделен цикл длины &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;]]&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt; S_{k + 1} = (v_1 \rightarrow w_2 \rightarrow w_1 \rightarrow v_3 \rightarrow \ldots \rightarrow v_k \rightarrow v_1) &amp;lt;/tex&amp;gt; – искомый цикл длины &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В любом случае утверждение верно, q.e.d.&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
Таким образом, любой сильно связанный турнир &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt; n \geq 3 &amp;lt;/tex&amp;gt; вершинами содержит цикл длины &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;, то есть гамильтонов цикл, q.e.d.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=&lt;br /&gt;
Следствие&lt;br /&gt;
|statement=&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;br /&gt;
[[Категория: Обходы графов]]&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</name></author>	</entry>

	<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%A0%D0%B5%D0%B4%D0%B5%D0%B8-%D0%9A%D0%B0%D0%BC%D0%B8%D0%BE%D0%BD%D0%B0&amp;diff=18520</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%A0%D0%B5%D0%B4%D0%B5%D0%B8-%D0%9A%D0%B0%D0%BC%D0%B8%D0%BE%D0%BD%D0%B0&amp;diff=18520"/>
				<updated>2012-02-29T07:11:25Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
Редеи-Камиона (для пути)&lt;br /&gt;
|statement=&lt;br /&gt;
В любом [[Турниры|турнире]] есть [[Гамильтоновы_графы#.D0.9E.D1.81.D0.BD.D0.BE.D0.B2.D0.BD.D1.8B.D0.B5_.D0.BE.D0.BF.D1.80.D0.B5.D0.B4.D0.B5.D0.BB.D0.B5.D0.BD.D0.B8.D1.8F|гамильтонов путь]].&lt;br /&gt;
|proof= &lt;br /&gt;
Приведем доказательство по индукции по числу вершин в графе. Пусть &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; {{---}} количество вершин в графе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; ''База  индукции:'' &amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Очевидно, для &amp;lt;tex&amp;gt; n = 3 &amp;lt;/tex&amp;gt; утверждение верно.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; ''Индукционный переход:'' &amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть предположение верно для всех турниров с количеством вершин не более &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;. Рассмотрим турнир &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt; n + 1 &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; T &amp;lt;/tex&amp;gt;.  Тогда турнир &amp;lt;tex&amp;gt; T - u &amp;lt;/tex&amp;gt; имеет &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; вершин, значит, в нем есть гамильтонов путь &amp;lt;tex&amp;gt; P: (v_1 \rightarrow v_2 \rightarrow \ldots \rightarrow v_n) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
[[Файл: Redei_kamion_3.png|250px|thumb|center]]&lt;br /&gt;
 &lt;br /&gt;
Одно из ребер &amp;lt;tex&amp;gt; (u, v_1) &amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt; (v_1, u) &amp;lt;/tex&amp;gt; обязательно содержится в &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Если ребро &amp;lt;tex&amp;gt; (u, v_1) \in ET &amp;lt;/tex&amp;gt;, то путь &amp;lt;tex&amp;gt; (u \rightarrow P) &amp;lt;/tex&amp;gt; - гамильтонов.&lt;br /&gt;
[[Файл: Redei_kamion_4.png|250px|thumb|center|&amp;lt;font color=#ED1C24&amp;gt;Красным&amp;lt;/font&amp;gt; цветом выделен искомый путь]]&lt;br /&gt;
&lt;br /&gt;
Пусть теперь ребро &amp;lt;tex&amp;gt; (u, v_1) \notin ET, v_i &amp;lt;/tex&amp;gt; - первая вершина пути &amp;lt;tex&amp;gt; P &amp;lt;/tex&amp;gt;,  для которой ребро &amp;lt;tex&amp;gt; (u, v_i) \in T &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Если такая вершина существует, то в &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; существует ребро &amp;lt;tex&amp;gt; (v_{i - 1}, u) &amp;lt;/tex&amp;gt; и путь &amp;lt;tex&amp;gt; (v_1 \rightarrow \ldots \rightarrow v_{i - 1} \rightarrow u \rightarrow v_i \rightarrow \ldots v_n) &amp;lt;/tex&amp;gt; – гамильтонов.&lt;br /&gt;
[[Файл: Redei_kamion_5.png|250px|thumb|center|&amp;lt;font color=#ED1C24&amp;gt;Красным&amp;lt;/font&amp;gt; цветом выделен искомый путь]]&lt;br /&gt;
&lt;br /&gt;
Если такой вершины не существует, то путь &amp;lt;tex&amp;gt; (P \rightarrow u) &amp;lt;/tex&amp;gt; - гамильтонов.&lt;br /&gt;
[[Файл: Redei_kamion_6.png|250px|thumb|center|&amp;lt;font color=#ED1C24&amp;gt;Красным&amp;lt;/font&amp;gt; цветом выделен искомый путь]]&lt;br /&gt;
&lt;br /&gt;
Значит, в любом случае в турнире существует гамильтонов путь, q.e.d.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
Редеи-Камиона (для цикла)&lt;br /&gt;
|statement=&lt;br /&gt;
В любом [[Отношение_связности,_компоненты_связности#.D0.A1.D0.B8.D0.BB.D1.8C.D0.BD.D0.B0.D1.8F_.D1.81.D0.B2.D1.8F.D0.B7.D0.BD.D0.BE.D1.81.D1.82.D1.8C|сильно связанном]] турнире есть [[Гамильтоновы_графы#.D0.9E.D1.81.D0.BD.D0.BE.D0.B2.D0.BD.D1.8B.D0.B5_.D0.BE.D0.BF.D1.80.D0.B5.D0.B4.D0.B5.D0.BB.D0.B5.D0.BD.D0.B8.D1.8F|гамильтонов цикл]].&lt;br /&gt;
|proof= &lt;br /&gt;
Приведем доказательство по индукции по числу вершин в цикле. Пусть &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt; - количество вершин в графе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; ''База  индукции:'' &amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Cильно связанный турнир &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt; n \geq 3 &amp;lt;/tex&amp;gt; вершин содержит [[Основные_определения_теории_графов#.D0.9E.D1.80.D0.B8.D0.B5.D0.BD.D1.82.D0.B8.D1.80.D0.BE.D0.B2.D0.B0.D0.BD.D0.BD.D1.8B.D0.B5_.D0.B3.D1.80.D0.B0.D1.84.D1.8B|цикл]] длины &amp;lt;tex&amp;gt; 3 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&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; VT - u &amp;lt;/tex&amp;gt; распадается на &amp;lt;tex&amp;gt; 2 &amp;lt;/tex&amp;gt; непересекающихся множества:&lt;br /&gt;
* &amp;lt;tex&amp;gt; V_1 = \{ v_1 \in VT | (v_1, u) \in ET \} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
* &amp;lt;tex&amp;gt; V_2 = \{ v_2 \in VT | (u, v_2) \in ET \} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
[[Файл: Redei_kamion_1.png|250px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; сильно связен, следовательно:&lt;br /&gt;
# &amp;lt;tex&amp;gt; V_1 \neq \emptyset &amp;lt;/tex&amp;gt;, (иначе &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; - исток турнира)&lt;br /&gt;
# &amp;lt;tex&amp;gt; V_2 \neq \emptyset &amp;lt;/tex&amp;gt;, (иначе &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; - сток турнира)&lt;br /&gt;
# &amp;lt;tex&amp;gt; \exists e = (w_2, w_1) \in ET &amp;lt;/tex&amp;gt;, (иначе нет пути из &amp;lt;tex&amp;gt;V_2&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;V_1&amp;lt;/tex&amp;gt;):&lt;br /&gt;
#* &amp;lt;tex&amp;gt; w_1 \in V_1 &amp;lt;/tex&amp;gt;,&lt;br /&gt;
#* &amp;lt;tex&amp;gt; w_2 \in V_2 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
[[Файл: Redei_kamion_2.png|250px|thumb|center|&amp;lt;font color=#ED1C24&amp;gt;Красным&amp;lt;/font&amp;gt; цветом выделен цикл длины &amp;lt;tex&amp;gt; 3 &amp;lt;/tex&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
Цикл &amp;lt;tex&amp;gt; S_3: (u \rightarrow w_2 \rightarrow w_1 \rightarrow u) &amp;lt;/tex&amp;gt; - искомый цикл длины &amp;lt;tex&amp;gt; 3 &amp;lt;/tex&amp;gt;, q.e.d.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; ''Индукционный переход:'' &amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Если сильно связанный турнир &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt; n \geq 3 &amp;lt;/tex&amp;gt; вершин содержит цикл &amp;lt;tex&amp;gt; S_k &amp;lt;/tex&amp;gt; длины &amp;lt;tex&amp;gt; k, (k &amp;lt; n)&amp;lt;/tex&amp;gt;, то он содержит и цикл длины &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; S_k = (v_1 \rightarrow v_2 \rightarrow \ldots \rightarrow v_k \rightarrow v_1) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; v_0 \notin S_k &amp;lt;/tex&amp;gt; такая, что &amp;lt;tex&amp;gt; \exists u, w \in S_k &amp;lt;/tex&amp;gt;:&lt;br /&gt;
* &amp;lt;tex&amp;gt; (v_0, u) \in ET &amp;lt;/tex&amp;gt;,&lt;br /&gt;
* &amp;lt;tex&amp;gt; (w, v_0) \in ET &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим два случая:&lt;br /&gt;
# существует такая вершина &amp;lt;tex&amp;gt; v_0 &amp;lt;/tex&amp;gt;,&lt;br /&gt;
# не существует такой вершины &amp;lt;tex&amp;gt; v_0 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Заметим, что при &amp;lt;tex&amp;gt;k = n - 1&amp;lt;/tex&amp;gt; такая вершина необходимо существует, так как иначе вершина, не входящая в цикл, будет являться либо стоком, либо истоком.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Первый случай: &amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; v_1 &amp;lt;/tex&amp;gt; - вершина из &amp;lt;tex&amp;gt; S_k &amp;lt;/tex&amp;gt; такая, что ребро &amp;lt;tex&amp;gt; e = (v_1, v_0 ) \in ET &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; v_i &amp;lt;/tex&amp;gt; – первая вершина при обходе &amp;lt;tex&amp;gt; S_k &amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt; v_1 &amp;lt;/tex&amp;gt;, для которой ребро &amp;lt;tex&amp;gt; f = (v_0, v_i ) \in ET &amp;lt;/tex&amp;gt;.&lt;br /&gt;
[[Файл: Redei_kamion_7.png|250px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Тогда ребро &amp;lt;tex&amp;gt; g = (v_{i - 1}, v_0) \in ET &amp;lt;/tex&amp;gt;.&lt;br /&gt;
[[Файл: Redei_kamion_8.png|250px|thumb|center|&amp;lt;font color=#ED1C24&amp;gt;Красным&amp;lt;/font&amp;gt; цветом выделен искомый цикл длины &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt; ]]&lt;br /&gt;
&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt; S_{k + 1} = (v_1 \rightarrow v_2 \rightarrow \ldots \rightarrow v_{i - 1} \rightarrow v_0 \rightarrow v_i \rightarrow \ldots \rightarrow v_k \rightarrow v_1) &amp;lt;/tex&amp;gt; – искомый цикл длины &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;u&amp;gt; Второй случай: &amp;lt;/u&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пусть:&lt;br /&gt;
* &amp;lt;tex&amp;gt; V_1 = \{ u \in VT | u \notin S_k, e = (u, v_i) \in ET, \forall i = \overline{1, n} \} &amp;lt;/tex&amp;gt;,&lt;br /&gt;
* &amp;lt;tex&amp;gt; V_2 = \{ u \in VT | u \notin S_k, f = (v_i, u) \in ET, \forall i = \overline{1, n} \} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt; V_1 \cap V_2 = \emptyset &amp;lt;/tex&amp;gt;.&lt;br /&gt;
[[Файл: Redei_kamion_9.png|250px|thumb|center]]&lt;br /&gt;
&lt;br /&gt;
Турнир сильно связен, следовательно:&lt;br /&gt;
* &amp;lt;tex&amp;gt; V_1 \neq \emptyset &amp;lt;/tex&amp;gt;, (иначе &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; не будет сильно связным, так как тогда нет простых путей с началом в &amp;lt;tex&amp;gt; V_2 &amp;lt;/tex&amp;gt; и концом в &amp;lt;tex&amp;gt; {v_1, \ldots, v_k} &amp;lt;/tex&amp;gt;)&lt;br /&gt;
* &amp;lt;tex&amp;gt; V_2 \neq \emptyset &amp;lt;/tex&amp;gt;, (иначе &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; не будет сильно связным, так как тогда нет простых путей с началом в &amp;lt;tex&amp;gt; {v_1, \ldots, v_k} &amp;lt;/tex&amp;gt; и концом в &amp;lt;tex&amp;gt; V_1 &amp;lt;/tex&amp;gt;)&lt;br /&gt;
* &amp;lt;tex&amp;gt; \exists g = (w_2, w_1) \in ET &amp;lt;/tex&amp;gt;, (иначе &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; не будет сильно связным, так как тогда нет простых путей с началом в &amp;lt;tex&amp;gt;V_2&amp;lt;/tex&amp;gt; и концом в &amp;lt;tex&amp;gt;V_1&amp;lt;/tex&amp;gt;):&lt;br /&gt;
** &amp;lt;tex&amp;gt; w_1 \in V_1 &amp;lt;/tex&amp;gt;,&lt;br /&gt;
** &amp;lt;tex&amp;gt; w_2 \in V_2 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
[[Файл: Redei_kamion_10.png|250px|thumb|center|&amp;lt;font color=#ED1C24&amp;gt;Красным&amp;lt;/font&amp;gt; цветом выделен цикл длины &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;]]&lt;br /&gt;
Тогда &amp;lt;tex&amp;gt; S_{k + 1} = (v_1 \rightarrow w_2 \rightarrow w_1 \rightarrow v_3 \rightarrow \ldots \rightarrow v_k \rightarrow v_1) &amp;lt;/tex&amp;gt; – искомый цикл длины &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
В любом случае утверждение верно, q.e.d.&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
Таким образом, любой сильно связанный турнир &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; с &amp;lt;tex&amp;gt; n \geq 3 &amp;lt;/tex&amp;gt; вершинами содержит цикл длины &amp;lt;tex&amp;gt; n &amp;lt;/tex&amp;gt;, то есть гамильтонов цикл, q.e.d.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=&lt;br /&gt;
Следствие&lt;br /&gt;
|statement=&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;br /&gt;
[[Категория: Обходы графов]]&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</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=18210</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=18210"/>
				<updated>2012-02-22T16:36:43Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1) Дефисы, где следует, заменить на тире.&lt;br /&gt;
&lt;br /&gt;
2) Можно убрать фразы про &amp;quot;разобьем на 2 доли&amp;quot; и т. д. Ясно, что алгоритм работает только на двудольных графах и можно сразу оперировать правой и левой долями.&lt;br /&gt;
&lt;br /&gt;
3) Так как подробное описание краткое, то краткое, думаю, можно уничтожить что бы не читать два раза одно и тоже.&lt;br /&gt;
&lt;br /&gt;
4) В алгоритме заменить (где это возможно) явную индексацию на теоретико-множественные операции. Ведь и так понятно как на самом деле можно реализовать ту или иную операцию. Название переменных лучше не сокращать.&lt;br /&gt;
&lt;br /&gt;
5) v = 1...n1 - нехорошо. т. к. левый операнд типа вершина правый операнд - число. &lt;br /&gt;
&lt;br /&gt;
6) Вместо пытаемся насытить - запускаем поиск увеличивающей цепи, нашли - делаем А, нет - делаем Б.&lt;br /&gt;
&lt;br /&gt;
7) В поиске увеличивающей цепи не надо говорить: &amp;quot;Изначально стоим там-то&amp;quot; Это слышится как глас сверху: &amp;quot;встань в вершину v, о чудесный дфс, если это первый твой запуск&amp;quot;. вершина v (лучше видимо u что бы не было конфликта имен) - это параметр дфса, который не должен знать о вершине каких-то внешних данных. И соответственно не должно быть special case для ребра из начальной вершины.&lt;br /&gt;
&lt;br /&gt;
В целом, тут нужны некоторые небольшие изменения, что бы сделать его более понятным.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Жалобы и предложения можно писать в обсуждения, но для уведомления нужно все-таки использовать форму.&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</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=18209</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=18209"/>
				<updated>2012-02-22T16:35:06Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1) Дефисы, где следует, заменить на тире.&lt;br /&gt;
&lt;br /&gt;
2) Можно убрать фразы про &amp;quot;разобьем на 2 доли&amp;quot; и т. д. Ясно, что алгоритм работает только на двудольных графах и можно сразу оперировать правой и левой долями.&lt;br /&gt;
&lt;br /&gt;
3) Так как подробное описание краткое, то краткое, думаю, можно уничтожить что бы не читать два раза одно и тоже.&lt;br /&gt;
&lt;br /&gt;
4) В алгоритме заменить (где это возможно) явную индексацию на теоретико-множественные операции. Ведь и так понятно как на самом деле можно реализовать ту или иную операцию. Название переменных лучше не сокращать.&lt;br /&gt;
&lt;br /&gt;
5) v = 1...n1 - нехорошо. т. к. левый операнд типа вершина правый операнд - число. &lt;br /&gt;
&lt;br /&gt;
6) Вместо пытаемся насытить - запускаем поиск увеличивающей цепи, нашли - делаем А, нет - делаем Б.&lt;br /&gt;
&lt;br /&gt;
7) В поиске увеличивающей цепи не надо говорить: &amp;quot;Изначально стоим там-то&amp;quot; Это слышится как глас сверху: &amp;quot;встань в вершину v, о чудесный дфс, если это первый твой запуск&amp;quot;. вершина v (лучше видимо u что бы не было конфликта имен) - это параметр дфса, который не должен знать о вершине каких-то внешних данных. И соответственно не должно быть special case для ребра из начальной вершины.&lt;br /&gt;
&lt;br /&gt;
В целом, тут нужны некоторые небольшие изменения, что бы сделать его более понятным.&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</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=18208</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=18208"/>
				<updated>2012-02-22T16:33:11Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: Новая страница: «1) Дефисы, где следует, заменить на тире. 2) Можно убрать фразы про &amp;quot;разобьем на 2 доли&amp;quot; и т. д....»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;1) Дефисы, где следует, заменить на тире.&lt;br /&gt;
2) Можно убрать фразы про &amp;quot;разобьем на 2 доли&amp;quot; и т. д. Ясно, что алгоритм работает только на двудольных графах и можно сразу оперировать правой и левой долями.&lt;br /&gt;
3) Так как подробное описание краткое, то краткое, думаю, можно уничтожить что бы не читать два раза одно и тоже.&lt;br /&gt;
4) В алгоритме заменить (где это возможно) явную индексацию на теоретико-множественные операции. Ведь и так понятно как на самом деле можно реализовать ту или иную операцию. Название переменных лучше не сокращать.&lt;br /&gt;
5) v = 1...n1 - нехорошо. т. к. левый операнд типа вершина правый операнд - число. &lt;br /&gt;
6) Вместо пытаемся насытить - запускаем поиск увеличивающей цепи, нашли - делаем А, нет - делаем Б.&lt;br /&gt;
7) В поиске увеличивающей цепи не надо говорить: &amp;quot;Изначально стоим там-то&amp;quot; Это слышится как глас сверху: &amp;quot;встань в вершину v, о чудесный дфс, если это первый твой запуск&amp;quot;. вершина v (лучше видимо u что бы не было конфликта имен) - это параметр дфса, который не должен знать о вершине каких-то внешних данных. И соответственно не должно быть special case для ребра из начальной вершины.&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Two_ways_to_cycle.png&amp;diff=17411</id>
		<title>Файл:Two ways to cycle.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Two_ways_to_cycle.png&amp;diff=17411"/>
				<updated>2012-01-20T16:33:15Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</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%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_%D1%86%D0%B8%D0%BA%D0%BB%D0%B0_%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_%D1%86%D0%B8%D0%BA%D0%BB%D0%B0&amp;diff=17410</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%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_%D1%86%D0%B8%D0%BA%D0%BB%D0%B0_%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_%D1%86%D0%B8%D0%BA%D0%BB%D0%B0&amp;diff=17410"/>
				<updated>2012-01-20T16:17:33Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: Новая страница: «Еще нужны рисунки...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Еще нужны рисунки...&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%AD%D0%B9%D0%BB%D0%B5%D1%80%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D1%8C_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=15368</id>
		<title>Эйлеровость графов</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%AD%D0%B9%D0%BB%D0%B5%D1%80%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D1%8C_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=15368"/>
				<updated>2011-12-29T22:02:19Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: /* Источники */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Эйлеров путь==&lt;br /&gt;
{{Определение|definition=&lt;br /&gt;
'''Эйлеровым путем''' в графе называется [[Основные определения теории графов|путь]], который проходит по каждому ребру, причем ровно один раз.&lt;br /&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;
{{Определение|definition=&lt;br /&gt;
'''Эйлеров цикл''' {{---}} замкнутый эйлеров путь.&lt;br /&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;
Для того, чтобы граф &amp;lt;tex&amp;gt;G = (V, E) &amp;lt;/tex&amp;gt; был эйлеровым необходимо чтобы:&lt;br /&gt;
1. Все вершины имели четную степень.&lt;br /&gt;
&lt;br /&gt;
2. Все компоненты связности кроме, может быть одной, не содержали ребер.&lt;br /&gt;
|proof=&lt;br /&gt;
1. Допустим в графе существует вершина с нечетной степенью. Рассмотрим эйлеров обход графа. Заметим, что при попадании в вершину и при выходе из нее мы уменьшаем ее степень на два(помечаем уже пройденые ребра), если эта вершина не является стартовой(она же конечная для цикла). Для стартовой(конечной) вершины мы уменьшаем ее степень на один в начале обхода эйлерова цикла, и на один при завершении. Следовательно вершин с нечетной степенью быть не может. Наше предположение неверно.&lt;br /&gt;
&lt;br /&gt;
2. Если в графе существует более одной компоненты связности с ребрами, то очевидно, что нельзя пройти по их ребрам одним путем.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
 |[[Файл:not_euler.png|200px|thumb| Эйлерова пути нет. Количество вершин нечетной степени больше двух.]]&lt;br /&gt;
 |[[Файл:not_euler2.png|200px|thumb| Две компоненты связности, одна имеет ребра.]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
В графе &amp;lt;tex&amp;gt;G = (V, E) &amp;lt;/tex&amp;gt; существует эйлеров цикл тогда и только тогда, когда:&lt;br /&gt;
&lt;br /&gt;
1. Все вершины имеют четную степень.&lt;br /&gt;
&lt;br /&gt;
2. Все компоненты связности кроме, может быть одной, не содержат ребер.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
Необходимость мы доказали ранее. Докажем достаточность, используя индукцию по числу вершин &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
База индукции: &amp;lt;tex&amp;gt;n = 0&amp;lt;/tex&amp;gt; цикл существует.&lt;br /&gt;
&lt;br /&gt;
Предположим что граф имеющий менее &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;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;n &amp;gt; 0&amp;lt;/tex&amp;gt; вершинами, степени которых четны.&lt;br /&gt;
&lt;br /&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; {{---}} вершины графа. Поскольку граф связный, то существует путь из &amp;lt;tex&amp;gt;v_1&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;v_2&amp;lt;/tex&amp;gt;. Поскольку степень &amp;lt;tex&amp;gt;v_2&amp;lt;/tex&amp;gt; {{---}} чётная, существует неиспользованное ребро, по которому можно продолжить путь. Поскольку граф конечный, то путь, в конце концов, должен вернуться в &amp;lt;tex&amp;gt;v_1&amp;lt;/tex&amp;gt;, и эйлеров цикл можно считать построенным. Если &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt; является эйлеровым циклом для &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, тогда доказательство закончено. Если нет, то пусть &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; {{---}} подграф графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, полученный удалением всех рёбер, принадлежащих &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt; содержит чётное число рёбер, инцидентных каждой вершине, то каждая вершина подграфа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; имеет чётную степень. Заметим что &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; может состоять из нескольких компонент связности.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какую-либо компоненту связности &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. Поскольку рассматриваемая компонента связности &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; имеет менее, чем &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершин, а у каждой вершины графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; чётная степень, то у каждой компоненты связности &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует эйлеров цикл. Пусть для рассматриваемой компоненты связноти это цикл &amp;lt;tex&amp;gt;C_2&amp;lt;/tex&amp;gt;. У &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;C_2&amp;lt;/tex&amp;gt; имеется общая вершина &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, так как &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; cвязен. Теперь можно обойти эйлеров цикл, начиная его в вершине &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, обойти &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt; , вернуться в &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, затем пройти &amp;lt;tex&amp;gt;C_2&amp;lt;/tex&amp;gt; и вернуться в &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;. Если новый эйлеров цикл не является эйлеровым циклом для &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, продолжаем использовать этот процесс, расширяя наш эйлеров цикл, пока, в конце концов, не получим эйлеров цикл для &amp;lt;tex&amp;gt;G&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;G = (V, E) &amp;lt;/tex&amp;gt; существует эйлеров путь тогда и только тогда, когда:&lt;br /&gt;
&lt;br /&gt;
1. Количество вершин с нечетной степенью меньше или равно двум.&lt;br /&gt;
&lt;br /&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;G = (V, E) &amp;lt;/tex&amp;gt; существует эйлеров цикл тогда и только тогда, когда:&lt;br /&gt;
&lt;br /&gt;
1. Входная степень любой вершины равна ее выходной степени.&lt;br /&gt;
&lt;br /&gt;
2. Все компоненты слабой связности кроме, может быть одной, не содержат ребер.&lt;br /&gt;
|proof=&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; существует эйлеров путь если:&lt;br /&gt;
&lt;br /&gt;
1. Входная степень любой вершины равна ее выходной степени, кроме двух вершин графа, для одной из которых &amp;lt;tex&amp;gt;deg^+ - deg^- = 1&amp;lt;/tex&amp;gt;, а для другой &amp;lt;tex&amp;gt;deg^+ - deg^- = -1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&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;
* Уилсон Р. Введение в теорию графов. {{---}} М.: Мир, 1977.&lt;br /&gt;
&lt;br /&gt;
==См. Также==&lt;br /&gt;
&lt;br /&gt;
* Ф.Харари Теория графов. Глава 7. Обходы графов. Эйлеровы графы.&lt;br /&gt;
* [http://e-maxx.ru/algo/euler_path Нахождение эйлерова пути]&lt;br /&gt;
* [[Алгоритм построения Эйлерова цикла]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Обходы графов]]&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%AD%D0%B9%D0%BB%D0%B5%D1%80%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D1%8C_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=15367</id>
		<title>Эйлеровость графов</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%AD%D0%B9%D0%BB%D0%B5%D1%80%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D1%8C_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=15367"/>
				<updated>2011-12-29T22:02:03Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: /* Источники */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Эйлеров путь==&lt;br /&gt;
{{Определение|definition=&lt;br /&gt;
'''Эйлеровым путем''' в графе называется [[Основные определения теории графов|путь]], который проходит по каждому ребру, причем ровно один раз.&lt;br /&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;
{{Определение|definition=&lt;br /&gt;
'''Эйлеров цикл''' {{---}} замкнутый эйлеров путь.&lt;br /&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;
Для того, чтобы граф &amp;lt;tex&amp;gt;G = (V, E) &amp;lt;/tex&amp;gt; был эйлеровым необходимо чтобы:&lt;br /&gt;
1. Все вершины имели четную степень.&lt;br /&gt;
&lt;br /&gt;
2. Все компоненты связности кроме, может быть одной, не содержали ребер.&lt;br /&gt;
|proof=&lt;br /&gt;
1. Допустим в графе существует вершина с нечетной степенью. Рассмотрим эйлеров обход графа. Заметим, что при попадании в вершину и при выходе из нее мы уменьшаем ее степень на два(помечаем уже пройденые ребра), если эта вершина не является стартовой(она же конечная для цикла). Для стартовой(конечной) вершины мы уменьшаем ее степень на один в начале обхода эйлерова цикла, и на один при завершении. Следовательно вершин с нечетной степенью быть не может. Наше предположение неверно.&lt;br /&gt;
&lt;br /&gt;
2. Если в графе существует более одной компоненты связности с ребрами, то очевидно, что нельзя пройти по их ребрам одним путем.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
 |[[Файл:not_euler.png|200px|thumb| Эйлерова пути нет. Количество вершин нечетной степени больше двух.]]&lt;br /&gt;
 |[[Файл:not_euler2.png|200px|thumb| Две компоненты связности, одна имеет ребра.]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
В графе &amp;lt;tex&amp;gt;G = (V, E) &amp;lt;/tex&amp;gt; существует эйлеров цикл тогда и только тогда, когда:&lt;br /&gt;
&lt;br /&gt;
1. Все вершины имеют четную степень.&lt;br /&gt;
&lt;br /&gt;
2. Все компоненты связности кроме, может быть одной, не содержат ребер.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
Необходимость мы доказали ранее. Докажем достаточность, используя индукцию по числу вершин &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
База индукции: &amp;lt;tex&amp;gt;n = 0&amp;lt;/tex&amp;gt; цикл существует.&lt;br /&gt;
&lt;br /&gt;
Предположим что граф имеющий менее &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;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;n &amp;gt; 0&amp;lt;/tex&amp;gt; вершинами, степени которых четны.&lt;br /&gt;
&lt;br /&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; {{---}} вершины графа. Поскольку граф связный, то существует путь из &amp;lt;tex&amp;gt;v_1&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;v_2&amp;lt;/tex&amp;gt;. Поскольку степень &amp;lt;tex&amp;gt;v_2&amp;lt;/tex&amp;gt; {{---}} чётная, существует неиспользованное ребро, по которому можно продолжить путь. Поскольку граф конечный, то путь, в конце концов, должен вернуться в &amp;lt;tex&amp;gt;v_1&amp;lt;/tex&amp;gt;, и эйлеров цикл можно считать построенным. Если &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt; является эйлеровым циклом для &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, тогда доказательство закончено. Если нет, то пусть &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; {{---}} подграф графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, полученный удалением всех рёбер, принадлежащих &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt; содержит чётное число рёбер, инцидентных каждой вершине, то каждая вершина подграфа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; имеет чётную степень. Заметим что &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; может состоять из нескольких компонент связности.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какую-либо компоненту связности &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. Поскольку рассматриваемая компонента связности &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; имеет менее, чем &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершин, а у каждой вершины графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; чётная степень, то у каждой компоненты связности &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует эйлеров цикл. Пусть для рассматриваемой компоненты связноти это цикл &amp;lt;tex&amp;gt;C_2&amp;lt;/tex&amp;gt;. У &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;C_2&amp;lt;/tex&amp;gt; имеется общая вершина &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, так как &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; cвязен. Теперь можно обойти эйлеров цикл, начиная его в вершине &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, обойти &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt; , вернуться в &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, затем пройти &amp;lt;tex&amp;gt;C_2&amp;lt;/tex&amp;gt; и вернуться в &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;. Если новый эйлеров цикл не является эйлеровым циклом для &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, продолжаем использовать этот процесс, расширяя наш эйлеров цикл, пока, в конце концов, не получим эйлеров цикл для &amp;lt;tex&amp;gt;G&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;G = (V, E) &amp;lt;/tex&amp;gt; существует эйлеров путь тогда и только тогда, когда:&lt;br /&gt;
&lt;br /&gt;
1. Количество вершин с нечетной степенью меньше или равно двум.&lt;br /&gt;
&lt;br /&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;G = (V, E) &amp;lt;/tex&amp;gt; существует эйлеров цикл тогда и только тогда, когда:&lt;br /&gt;
&lt;br /&gt;
1. Входная степень любой вершины равна ее выходной степени.&lt;br /&gt;
&lt;br /&gt;
2. Все компоненты слабой связности кроме, может быть одной, не содержат ребер.&lt;br /&gt;
|proof=&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; существует эйлеров путь если:&lt;br /&gt;
&lt;br /&gt;
1. Входная степень любой вершины равна ее выходной степени, кроме двух вершин графа, для одной из которых &amp;lt;tex&amp;gt;deg^+ - deg^- = 1&amp;lt;/tex&amp;gt;, а для другой &amp;lt;tex&amp;gt;deg^+ - deg^- = -1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&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;
* Уилсон Р. Введение в теорию графов. {{–--}} М.: Мир, 1977.&lt;br /&gt;
&lt;br /&gt;
==См. Также==&lt;br /&gt;
&lt;br /&gt;
* Ф.Харари Теория графов. Глава 7. Обходы графов. Эйлеровы графы.&lt;br /&gt;
* [http://e-maxx.ru/algo/euler_path Нахождение эйлерова пути]&lt;br /&gt;
* [[Алгоритм построения Эйлерова цикла]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Обходы графов]]&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%AD%D0%B9%D0%BB%D0%B5%D1%80%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D1%8C_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=15365</id>
		<title>Эйлеровость графов</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%AD%D0%B9%D0%BB%D0%B5%D1%80%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D1%8C_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=15365"/>
				<updated>2011-12-29T21:58:12Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: /* Критерий эйлеровости */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Эйлеров путь==&lt;br /&gt;
{{Определение|definition=&lt;br /&gt;
'''Эйлеровым путем''' в графе называется [[Основные определения теории графов|путь]], который проходит по каждому ребру, причем ровно один раз.&lt;br /&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;
{{Определение|definition=&lt;br /&gt;
'''Эйлеров цикл''' {{---}} замкнутый эйлеров путь.&lt;br /&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;
Для того, чтобы граф &amp;lt;tex&amp;gt;G = (V, E) &amp;lt;/tex&amp;gt; был эйлеровым необходимо чтобы:&lt;br /&gt;
1. Все вершины имели четную степень.&lt;br /&gt;
&lt;br /&gt;
2. Все компоненты связности кроме, может быть одной, не содержали ребер.&lt;br /&gt;
|proof=&lt;br /&gt;
1. Допустим в графе существует вершина с нечетной степенью. Рассмотрим эйлеров обход графа. Заметим, что при попадании в вершину и при выходе из нее мы уменьшаем ее степень на два(помечаем уже пройденые ребра), если эта вершина не является стартовой(она же конечная для цикла). Для стартовой(конечной) вершины мы уменьшаем ее степень на один в начале обхода эйлерова цикла, и на один при завершении. Следовательно вершин с нечетной степенью быть не может. Наше предположение неверно.&lt;br /&gt;
&lt;br /&gt;
2. Если в графе существует более одной компоненты связности с ребрами, то очевидно, что нельзя пройти по их ребрам одним путем.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
 |[[Файл:not_euler.png|200px|thumb| Эйлерова пути нет. Количество вершин нечетной степени больше двух.]]&lt;br /&gt;
 |[[Файл:not_euler2.png|200px|thumb| Две компоненты связности, одна имеет ребра.]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
В графе &amp;lt;tex&amp;gt;G = (V, E) &amp;lt;/tex&amp;gt; существует эйлеров цикл тогда и только тогда, когда:&lt;br /&gt;
&lt;br /&gt;
1. Все вершины имеют четную степень.&lt;br /&gt;
&lt;br /&gt;
2. Все компоненты связности кроме, может быть одной, не содержат ребер.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
Необходимость мы доказали ранее. Докажем достаточность, используя индукцию по числу вершин &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
База индукции: &amp;lt;tex&amp;gt;n = 0&amp;lt;/tex&amp;gt; цикл существует.&lt;br /&gt;
&lt;br /&gt;
Предположим что граф имеющий менее &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;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;n &amp;gt; 0&amp;lt;/tex&amp;gt; вершинами, степени которых четны.&lt;br /&gt;
&lt;br /&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; {{---}} вершины графа. Поскольку граф связный, то существует путь из &amp;lt;tex&amp;gt;v_1&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;v_2&amp;lt;/tex&amp;gt;. Поскольку степень &amp;lt;tex&amp;gt;v_2&amp;lt;/tex&amp;gt; {{---}} чётная, существует неиспользованное ребро, по которому можно продолжить путь. Поскольку граф конечный, то путь, в конце концов, должен вернуться в &amp;lt;tex&amp;gt;v_1&amp;lt;/tex&amp;gt;, и эйлеров цикл можно считать построенным. Если &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt; является эйлеровым циклом для &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, тогда доказательство закончено. Если нет, то пусть &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; {{---}} подграф графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, полученный удалением всех рёбер, принадлежащих &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt; содержит чётное число рёбер, инцидентных каждой вершине, то каждая вершина подграфа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; имеет чётную степень. Заметим что &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; может состоять из нескольких компонент связности.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какую-либо компоненту связности &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. Поскольку рассматриваемая компонента связности &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; имеет менее, чем &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершин, а у каждой вершины графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; чётная степень, то у каждой компоненты связности &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует эйлеров цикл. Пусть для рассматриваемой компоненты связноти это цикл &amp;lt;tex&amp;gt;C_2&amp;lt;/tex&amp;gt;. У &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;C_2&amp;lt;/tex&amp;gt; имеется общая вершина &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, так как &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; cвязен. Теперь можно обойти эйлеров цикл, начиная его в вершине &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, обойти &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt; , вернуться в &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, затем пройти &amp;lt;tex&amp;gt;C_2&amp;lt;/tex&amp;gt; и вернуться в &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;. Если новый эйлеров цикл не является эйлеровым циклом для &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, продолжаем использовать этот процесс, расширяя наш эйлеров цикл, пока, в конце концов, не получим эйлеров цикл для &amp;lt;tex&amp;gt;G&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;G = (V, E) &amp;lt;/tex&amp;gt; существует эйлеров путь тогда и только тогда, когда:&lt;br /&gt;
&lt;br /&gt;
1. Количество вершин с нечетной степенью меньше или равно двум.&lt;br /&gt;
&lt;br /&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;G = (V, E) &amp;lt;/tex&amp;gt; существует эйлеров цикл тогда и только тогда, когда:&lt;br /&gt;
&lt;br /&gt;
1. Входная степень любой вершины равна ее выходной степени.&lt;br /&gt;
&lt;br /&gt;
2. Все компоненты слабой связности кроме, может быть одной, не содержат ребер.&lt;br /&gt;
|proof=&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; существует эйлеров путь если:&lt;br /&gt;
&lt;br /&gt;
1. Входная степень любой вершины равна ее выходной степени, кроме двух вершин графа, для одной из которых &amp;lt;tex&amp;gt;deg^+ - deg^- = 1&amp;lt;/tex&amp;gt;, а для другой &amp;lt;tex&amp;gt;deg^+ - deg^- = -1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&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;
* Уилсон Р. Введение в теорию графов. – М.: Мир, 1977.&lt;br /&gt;
&lt;br /&gt;
==См. Также==&lt;br /&gt;
&lt;br /&gt;
* Ф.Харари Теория графов. Глава 7. Обходы графов. Эйлеровы графы.&lt;br /&gt;
* [http://e-maxx.ru/algo/euler_path Нахождение эйлерова пути]&lt;br /&gt;
* [[Алгоритм построения Эйлерова цикла]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Обходы графов]]&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%AD%D0%B9%D0%BB%D0%B5%D1%80%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D1%8C_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=15364</id>
		<title>Эйлеровость графов</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%AD%D0%B9%D0%BB%D0%B5%D1%80%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D1%8C_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=15364"/>
				<updated>2011-12-29T21:57:42Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: /* Критерий эйлеровости */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Эйлеров путь==&lt;br /&gt;
{{Определение|definition=&lt;br /&gt;
'''Эйлеровым путем''' в графе называется [[Основные определения теории графов|путь]], который проходит по каждому ребру, причем ровно один раз.&lt;br /&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;
{{Определение|definition=&lt;br /&gt;
'''Эйлеров цикл''' {{---}} замкнутый эйлеров путь.&lt;br /&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;
Для того, чтобы граф &amp;lt;tex&amp;gt;G = (V, E) &amp;lt;/tex&amp;gt; был эйлеровым необходимо чтобы:&lt;br /&gt;
1. Все вершины имели четную степень.&lt;br /&gt;
&lt;br /&gt;
2. Все компоненты связности кроме, может быть одной, не содержали ребер.&lt;br /&gt;
|proof=&lt;br /&gt;
1. Допустим в графе существует вершина с нечетной степенью. Рассмотрим эйлеров обход графа. Заметим, что при попадании в вершину и при выходе из нее мы уменьшаем ее степень на два(помечаем уже пройденые ребра), если эта вершина не является стартовой(она же конечная для цикла). Для стартовой(конечной) вершины мы уменьшаем ее степень на один в начале обхода эйлерова цикла, и на один при завершении. Следовательно вершин с нечетной степенью быть не может. Наше предположение неверно.&lt;br /&gt;
&lt;br /&gt;
2. Если в графе существует более одной компоненты связности с ребрами, то очевидно, что нельзя пройти по их ребрам одним путем.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
 |[[Файл:not_euler.png|200px|thumb| Эйлерова пути нет. Количество вершин нечетной степени больше двух.]]&lt;br /&gt;
 |[[Файл:not_euler2.png|200px|thumb| Две компоненты связности, одна имеет ребра.]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
В графе &amp;lt;tex&amp;gt;G = (V, E) &amp;lt;/tex&amp;gt; существует эйлеров цикл тогда и только тогда, когда:&lt;br /&gt;
&lt;br /&gt;
1. Все вершины имеют четную степень.&lt;br /&gt;
&lt;br /&gt;
2. Все компоненты связности кроме, может быть одной, не содержат ребер.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
Необходимость мы доказали ранее. Докажем достаточность, используя индукцию по числу вершин &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
База индукции: &amp;lt;tex&amp;gt;n = 0&amp;lt;/tex&amp;gt; цикл существует.&lt;br /&gt;
&lt;br /&gt;
Предположим что граф имеющий менее &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;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;n &amp;gt; 0&amp;lt;/tex&amp;gt; вершинами, степени которых четны.&lt;br /&gt;
&lt;br /&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; - вершины графа. Поскольку граф связный, то существует путь из &amp;lt;tex&amp;gt;v_1&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;v_2&amp;lt;/tex&amp;gt;. Поскольку степень &amp;lt;tex&amp;gt;v_2&amp;lt;/tex&amp;gt; {{---}} чётная, существует неиспользованное ребро, по которому можно продолжить путь. Поскольку граф конечный, то путь, в конце концов, должен вернуться в &amp;lt;tex&amp;gt;v_1&amp;lt;/tex&amp;gt;, и эйлеров цикл можно считать построенным. Если &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt; является эйлеровым циклом для &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, тогда доказательство закончено. Если нет, то пусть &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; {{---}} подграф графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, полученный удалением всех рёбер, принадлежащих &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt; содержит чётное число рёбер, инцидентных каждой вершине, то каждая вершина подграфа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; имеет чётную степень. Заметим что &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; может состоять из нескольких компонент связности.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какую-либо компоненту связности &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. Поскольку рассматриваемая компонента связности &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; имеет менее, чем &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершин, а у каждой вершины графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; чётная степень, то у каждой компоненты связности &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует эйлеров цикл. Пусть для рассматриваемой компоненты связноти это цикл &amp;lt;tex&amp;gt;C_2&amp;lt;/tex&amp;gt;. У &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;C_2&amp;lt;/tex&amp;gt; имеется общая вершина &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, так как &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; cвязен. Теперь можно обойти эйлеров цикл, начиная его в вершине &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, обойти &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt; , вернуться в &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, затем пройти &amp;lt;tex&amp;gt;C_2&amp;lt;/tex&amp;gt; и вернуться в &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;. Если новый эйлеров цикл не является эйлеровым циклом для &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, продолжаем использовать этот процесс, расширяя наш эйлеров цикл, пока, в конце концов, не получим эйлеров цикл для &amp;lt;tex&amp;gt;G&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;G = (V, E) &amp;lt;/tex&amp;gt; существует эйлеров путь тогда и только тогда, когда:&lt;br /&gt;
&lt;br /&gt;
1. Количество вершин с нечетной степенью меньше или равно двум.&lt;br /&gt;
&lt;br /&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;G = (V, E) &amp;lt;/tex&amp;gt; существует эйлеров цикл тогда и только тогда, когда:&lt;br /&gt;
&lt;br /&gt;
1. Входная степень любой вершины равна ее выходной степени.&lt;br /&gt;
&lt;br /&gt;
2. Все компоненты слабой связности кроме, может быть одной, не содержат ребер.&lt;br /&gt;
|proof=&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; существует эйлеров путь если:&lt;br /&gt;
&lt;br /&gt;
1. Входная степень любой вершины равна ее выходной степени, кроме двух вершин графа, для одной из которых &amp;lt;tex&amp;gt;deg^+ - deg^- = 1&amp;lt;/tex&amp;gt;, а для другой &amp;lt;tex&amp;gt;deg^+ - deg^- = -1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&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;
* Уилсон Р. Введение в теорию графов. – М.: Мир, 1977.&lt;br /&gt;
&lt;br /&gt;
==См. Также==&lt;br /&gt;
&lt;br /&gt;
* Ф.Харари Теория графов. Глава 7. Обходы графов. Эйлеровы графы.&lt;br /&gt;
* [http://e-maxx.ru/algo/euler_path Нахождение эйлерова пути]&lt;br /&gt;
* [[Алгоритм построения Эйлерова цикла]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Обходы графов]]&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%AD%D0%B9%D0%BB%D0%B5%D1%80%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D1%8C_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=15363</id>
		<title>Эйлеровость графов</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%AD%D0%B9%D0%BB%D0%B5%D1%80%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D1%8C_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=15363"/>
				<updated>2011-12-29T21:55:38Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: /* Критерий эйлеровости */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Эйлеров путь==&lt;br /&gt;
{{Определение|definition=&lt;br /&gt;
'''Эйлеровым путем''' в графе называется [[Основные определения теории графов|путь]], который проходит по каждому ребру, причем ровно один раз.&lt;br /&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;
{{Определение|definition=&lt;br /&gt;
'''Эйлеров цикл''' {{---}} замкнутый эйлеров путь.&lt;br /&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;
Для того, чтобы граф &amp;lt;tex&amp;gt;G = (V, E) &amp;lt;/tex&amp;gt; был эйлеровым необходимо чтобы:&lt;br /&gt;
1. Все вершины имели четную степень.&lt;br /&gt;
&lt;br /&gt;
2. Все компоненты связности кроме, может быть одной, не содержали ребер.&lt;br /&gt;
|proof=&lt;br /&gt;
1. Допустим в графе существует вершина с нечетной степенью. Рассмотрим эйлеров обход графа. Заметим, что при попадании в вершину и при выходе из нее мы уменьшаем ее степень на два(помечаем уже пройденые ребра), если эта вершина не является стартовой(она же конечная для цикла). Для стартовой(конечной) вершины мы уменьшаем ее степень на один в начале обхода эйлерова цикла, и на один при завершении. Следовательно вершин с нечетной степенью быть не может. Наше предположение неверно.&lt;br /&gt;
&lt;br /&gt;
2. Если в графе существует более одной компоненты связности с ребрами, то очевидно, что нельзя пройти по их ребрам одним путем.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
 |[[Файл:not_euler.png|200px|thumb| Эйлерова пути нет. Количество вершин нечетной степени больше двух.]]&lt;br /&gt;
 |[[Файл:not_euler2.png|200px|thumb| Две компоненты связности, одна имеет ребра.]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
В графе &amp;lt;tex&amp;gt;G = (V, E) &amp;lt;/tex&amp;gt; существует эйлеров цикл тогда и только тогда, когда:&lt;br /&gt;
&lt;br /&gt;
1. Все вершины имеют четную степень.&lt;br /&gt;
&lt;br /&gt;
2. Все компоненты связности кроме, может быть одной, не содержат ребер.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
Необходимость мы доказали ранее. Докажем достаточность, используя индукцию по числу вершин &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
База индукции: &amp;lt;tex&amp;gt;n = 0&amp;lt;/tex&amp;gt; цикл существует.&lt;br /&gt;
&lt;br /&gt;
Предположим что граф имеющий менее &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;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;n &amp;gt; 0&amp;lt;/tex&amp;gt; вершинами, степени которых четны.&lt;br /&gt;
&lt;br /&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; - вершины графа. Поскольку граф связный, то существует путь из &amp;lt;tex&amp;gt;v_1&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;v_2&amp;lt;/tex&amp;gt;. Поскольку степень &amp;lt;tex&amp;gt;v_2&amp;lt;/tex&amp;gt; {{---}} чётная, существует неиспользованное ребро, по которому можно продолжить путь. Поскольку граф конечный, то путь, в конце концов, должен вернуться в &amp;lt;tex&amp;gt;v_1&amp;lt;/tex&amp;gt;, и эйлеров цикл можно считать построенным. Если &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt; является эйлеровым циклом для &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, тогда доказательство закончено. Если нет, то пусть &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; {{---}} подграф графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, полученный удалением всех рёбер, принадлежащих &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt; содержит чётное число рёбер, инцидентных каждой вершине, то каждая вершина подграфа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; имеет чётную степень. Заметим что &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; может состоять из нескольких компонент связности.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какую {{---}} либо компоненту связности &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. Поскольку рассматриваемая компонента связности &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; имеет менее, чем &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершин, а у каждой вершины графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; чётная степень, то у каждой компоненты связности &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует эйлеров цикл. Пусть для рассматриваемой компоненты связноти это цикл &amp;lt;tex&amp;gt;C_2&amp;lt;/tex&amp;gt;. У &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;C_2&amp;lt;/tex&amp;gt; имеется общая вершина &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, так как &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; cвязен. Теперь можно обойти эйлеров цикл, начиная его в вершине &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, обойти &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt; , вернуться в &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, затем пройти &amp;lt;tex&amp;gt;C_2&amp;lt;/tex&amp;gt; и вернуться в &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;. Если новый эйлеров цикл не является эйлеровым циклом для &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, продолжаем использовать этот процесс, расширяя наш эйлеров цикл, пока, в конце концов, не получим эйлеров цикл для &amp;lt;tex&amp;gt;G&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;G = (V, E) &amp;lt;/tex&amp;gt; существует эйлеров путь тогда и только тогда, когда:&lt;br /&gt;
&lt;br /&gt;
1. Количество вершин с нечетной степенью меньше или равно двум.&lt;br /&gt;
&lt;br /&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;G = (V, E) &amp;lt;/tex&amp;gt; существует эйлеров цикл тогда и только тогда, когда:&lt;br /&gt;
&lt;br /&gt;
1. Входная степень любой вершины равна ее выходной степени.&lt;br /&gt;
&lt;br /&gt;
2. Все компоненты слабой связности кроме, может быть одной, не содержат ребер.&lt;br /&gt;
|proof=&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; существует эйлеров путь если:&lt;br /&gt;
&lt;br /&gt;
1. Входная степень любой вершины равна ее выходной степени, кроме двух вершин графа, для одной из которых &amp;lt;tex&amp;gt;deg^+ - deg^- = 1&amp;lt;/tex&amp;gt;, а для другой &amp;lt;tex&amp;gt;deg^+ - deg^- = -1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&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;
* Уилсон Р. Введение в теорию графов. – М.: Мир, 1977.&lt;br /&gt;
&lt;br /&gt;
==См. Также==&lt;br /&gt;
&lt;br /&gt;
* Ф.Харари Теория графов. Глава 7. Обходы графов. Эйлеровы графы.&lt;br /&gt;
* [http://e-maxx.ru/algo/euler_path Нахождение эйлерова пути]&lt;br /&gt;
* [[Алгоритм построения Эйлерова цикла]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Обходы графов]]&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%AD%D0%B9%D0%BB%D0%B5%D1%80%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D1%8C_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=15362</id>
		<title>Эйлеровость графов</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%AD%D0%B9%D0%BB%D0%B5%D1%80%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D1%8C_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=15362"/>
				<updated>2011-12-29T21:54:13Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: /* Эйлеров цикл */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Эйлеров путь==&lt;br /&gt;
{{Определение|definition=&lt;br /&gt;
'''Эйлеровым путем''' в графе называется [[Основные определения теории графов|путь]], который проходит по каждому ребру, причем ровно один раз.&lt;br /&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;
{{Определение|definition=&lt;br /&gt;
'''Эйлеров цикл''' {{---}} замкнутый эйлеров путь.&lt;br /&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;
Для того, чтобы граф &amp;lt;tex&amp;gt;G = (V, E) &amp;lt;/tex&amp;gt; был эйлеровым необходимо чтобы:&lt;br /&gt;
1. Все вершины имели четную степень.&lt;br /&gt;
&lt;br /&gt;
2. Все компоненты связности кроме, может быть одной, не содержали ребер.&lt;br /&gt;
|proof=&lt;br /&gt;
1. Допустим в графе существует вершина с нечетной степенью. Рассмотрим эйлеров обход графа. Заметим, что при попадании в вершину и при выходе из нее мы уменьшаем ее степень на два(помечаем уже пройденые ребра), если эта вершина не является стартовой(она же конечная для цикла). Для стартовой(конечной) вершины мы уменьшаем ее степень на один в начале обхода эйлерова цикла, и на один при завершении. Следовательно вершин с нечетной степенью быть не может. Наше предположение неверно.&lt;br /&gt;
&lt;br /&gt;
2. Если в графе существует более одной компоненты связности с ребрами, то очевидно, что нельзя пройти по их ребрам одним путем.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
 |[[Файл:not_euler.png|200px|thumb| Эйлерова пути нет. Количество вершин нечетной степени больше двух.]]&lt;br /&gt;
 |[[Файл:not_euler2.png|200px|thumb| Две компоненты связности, одна имеет ребра.]]&lt;br /&gt;
 |}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
В графе &amp;lt;tex&amp;gt;G = (V, E) &amp;lt;/tex&amp;gt; существует эйлеров цикл тогда и только тогда, когда:&lt;br /&gt;
&lt;br /&gt;
1. Все вершины имеют четную степень.&lt;br /&gt;
&lt;br /&gt;
2. Все компоненты связности кроме, может быть одной, не содержат ребер.&lt;br /&gt;
&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
Необходимость мы доказали ранее. Докажем достаточность, используя индукцию по числу вершин &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
База индукции: &amp;lt;tex&amp;gt;n = 0&amp;lt;/tex&amp;gt; цикл существует.&lt;br /&gt;
&lt;br /&gt;
Предположим что граф имеющий менее &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;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;n &amp;gt; 0&amp;lt;/tex&amp;gt; вершинами, степени которых четны.&lt;br /&gt;
&lt;br /&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; - вершины графа. Поскольку граф связный, то существует путь из &amp;lt;tex&amp;gt;v_1&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;v_2&amp;lt;/tex&amp;gt;. Поскольку степень &amp;lt;tex&amp;gt;v_2&amp;lt;/tex&amp;gt; - чётная, существует неиспользованное ребро, по которому можно продолжить путь. Поскольку граф конечный, то путь, в конце концов, должен вернуться в &amp;lt;tex&amp;gt;v_1&amp;lt;/tex&amp;gt;, и эйлеров цикл можно считать построенным. Если &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt; является эйлеровым циклом для &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, тогда доказательство закончено. Если нет, то пусть &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; - подграф графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, полученный удалением всех рёбер, принадлежащих &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt; содержит чётное число рёбер, инцидентных каждой вершине, то каждая вершина подграфа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; имеет чётную степень. Заметим что &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; может состоять из нескольких компонент связности.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим какую - либо компоненту связности &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt;. Поскольку рассматриваемая компонента связности &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; имеет менее, чем &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; вершин, а у каждой вершины графа &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; чётная степень, то у каждой компоненты связности &amp;lt;tex&amp;gt;G'&amp;lt;/tex&amp;gt; существует эйлеров цикл. Пусть для рассматриваемой компоненты связноти это цикл &amp;lt;tex&amp;gt;C_2&amp;lt;/tex&amp;gt;. У &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;C_2&amp;lt;/tex&amp;gt; имеется общая вершина &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, так как &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; cвязен. Теперь можно обойти эйлеров цикл, начиная его в вершине &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, обойти &amp;lt;tex&amp;gt;C_1&amp;lt;/tex&amp;gt; , вернуться в &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, затем пройти &amp;lt;tex&amp;gt;C_2&amp;lt;/tex&amp;gt; и вернуться в &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;. Если новый эйлеров цикл не является эйлеровым циклом для &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, продолжаем использовать этот процесс, расширяя наш эйлеров цикл, пока, в конце концов, не получим эйлеров цикл для &amp;lt;tex&amp;gt;G&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;G = (V, E) &amp;lt;/tex&amp;gt; существует эйлеров путь тогда и только тогда, когда:&lt;br /&gt;
&lt;br /&gt;
1. Количество вершин с нечетной степенью меньше или равно двум.&lt;br /&gt;
&lt;br /&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;G = (V, E) &amp;lt;/tex&amp;gt; существует эйлеров цикл тогда и только тогда, когда:&lt;br /&gt;
&lt;br /&gt;
1. Входная степень любой вершины равна ее выходной степени.&lt;br /&gt;
&lt;br /&gt;
2. Все компоненты слабой связности кроме, может быть одной, не содержат ребер.&lt;br /&gt;
|proof=&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; существует эйлеров путь если:&lt;br /&gt;
&lt;br /&gt;
1. Входная степень любой вершины равна ее выходной степени, кроме двух вершин графа, для одной из которых &amp;lt;tex&amp;gt;deg^+ - deg^- = 1&amp;lt;/tex&amp;gt;, а для другой &amp;lt;tex&amp;gt;deg^+ - deg^- = -1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&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;
* Уилсон Р. Введение в теорию графов. – М.: Мир, 1977.&lt;br /&gt;
&lt;br /&gt;
==См. Также==&lt;br /&gt;
&lt;br /&gt;
* Ф.Харари Теория графов. Глава 7. Обходы графов. Эйлеровы графы.&lt;br /&gt;
* [http://e-maxx.ru/algo/euler_path Нахождение эйлерова пути]&lt;br /&gt;
* [[Алгоритм построения Эйлерова цикла]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Обходы графов]]&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</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%A4%D0%BB%D0%BE%D0%B9%D0%B4%D0%B0&amp;diff=12856</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%BB%D0%BE%D0%B9%D0%B4%D0%B0&amp;diff=12856"/>
				<updated>2011-11-07T18:41:17Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: /* Код (окончательный) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Алгоритм Флойда (алгоритм Флойда–Уоршелла)''' {{---}} алгоритм нахождения длин кратчайших путей между всеми парами вершин во взвешенном ориентированном графе. Работает корректно, если в графе нет циклов отрицательной величины, а в случае, когда такой цикл есть, позволяет найти хотя бы один такой цикл. Этот алгоритм работает в течение времени &amp;lt;tex&amp;gt; \Theta(n^3) &amp;lt;/tex&amp;gt; и использует &amp;lt;tex&amp;gt; \Theta(n^2) &amp;lt;/tex&amp;gt; памяти. Разработан в 1962 году.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
[[Файл:Floyd.png|right|thumb|Текущий (синий) путь и потенциально более короткий (красный)]]&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;\omega_{uv} =&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\text{weight of }uv ,&amp;amp; \text{if } uv \in E \\&lt;br /&gt;
+\infty ,&amp;amp; \text{if } uv \notin E&lt;br /&gt;
\end{cases}&amp;lt;/tex&amp;gt;, в котором вершины пронумерованы от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;. Требуется найти матрицу кратчайших расстояний &amp;lt;tex&amp;gt; d &amp;lt;/tex&amp;gt;, в которой элемент &amp;lt;tex&amp;gt; d_{ij} &amp;lt;/tex&amp;gt; либо равен длине кратчайшего пути из &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;, либо равен &amp;lt;tex&amp;gt; +\infty &amp;lt;/tex&amp;gt;, если вершина &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; не достижима из &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&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;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, только вершины из множества &amp;lt;tex&amp;gt; \{ 1 .. i \} &amp;lt;/tex&amp;gt; как &amp;lt;tex&amp;gt;d_{uv}^{(i)}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;d_{uv}^{(0)} = \omega_{uv}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге алгоритма, мы будем брать очередную вершину (пусть её номер {{---}} &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;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; d_{uv}^{(i)} = min(d_{uv}^{(i-1)}, d_{ui}^{(i-1)} + d_{iv}^{(i-1)}) &amp;lt;/tex&amp;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; \{ 1 .. i \} &amp;lt;/tex&amp;gt;, проходит через вершину &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;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; u &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, объединенный с кратчайшим путем из &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;. В противном случае, когда этот путь не содержит вершины &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;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; \{ 1 .. i \} &amp;lt;/tex&amp;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; \{ 1 .. i-1 \} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Код (в первом приближении) ===&lt;br /&gt;
  # Инициализация&lt;br /&gt;
  &amp;lt;tex dpi = &amp;quot;105&amp;quot;&amp;gt; d^{(0)} = w &amp;lt;/tex&amp;gt;&lt;br /&gt;
  # Основная часть&lt;br /&gt;
  for i in {1..n}:&lt;br /&gt;
    for u in {1..n}:&lt;br /&gt;
      for v in {1..n}:&lt;br /&gt;
        &amp;lt;tex dpi = &amp;quot;105&amp;quot; &amp;gt; d^{(i)}_{uv} = min(d^{(i - 1)}_{uv}, d^{(i - 1)}_{ui} + d^{(i - 1)}_{iv}) &amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
В итоге получаем, что матрица &amp;lt;tex&amp;gt; d^{(n)} &amp;lt;/tex&amp;gt; и является искомой матрицей кратчайших путей, поскольку содержит в себе длины кратчайших путей между всеми парами вершин, имеющих в качестве промежуточных вершин вершины из множества &amp;lt;tex&amp;gt; \{ 1..n \} &amp;lt;/tex&amp;gt;, что есть попросту все вершины графа. Такая реализация работает за &amp;lt;tex&amp;gt; \Theta(n^3) &amp;lt;/tex&amp;gt; времени и использует &amp;lt;tex&amp;gt; \Theta(n^3) &amp;lt;/tex&amp;gt; памяти.&lt;br /&gt;
&lt;br /&gt;
=== Код (окончательный) ===&lt;br /&gt;
Утверждается, что можно избавиться от одной размерности в массиве &amp;lt;tex&amp;gt; d &amp;lt;/tex&amp;gt;, т.е. использовать двумерный массив &amp;lt;tex&amp;gt;d_{uv}&amp;lt;/tex&amp;gt;. В процессе работы алгоритма поддерживается инвариант &amp;lt;tex&amp;gt;\rho(u, v) \le d_{uv} \le d_{uv}^{(i)}&amp;lt;/tex&amp;gt;, а, поскольку, после выполнения работы алгоритма &amp;lt;tex&amp;gt; \rho(u, v) == d_{uv}^{(i)} &amp;lt;/tex&amp;gt;, то тогда будет выполняться и &amp;lt;tex&amp;gt; \rho(u, v) == d_{uv} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
В течение работы алгоритма Флойда выполняются неравенства: &amp;lt;tex&amp;gt;\rho(u, v) \le d_{uv} \le d_{uv}^{(i)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
После инициализации все неравенства, очевидно, выполняются. Далее, массив &amp;lt;tex&amp;gt; d &amp;lt;/tex&amp;gt; может измениться только в строчке 5. &lt;br /&gt;
&lt;br /&gt;
'''Докажем второе неравенство индукцией по итерациям алгоритма.'''&lt;br /&gt;
&lt;br /&gt;
Пусть также &amp;lt;tex&amp;gt;d'_{uv}&amp;lt;/tex&amp;gt; - значение &amp;lt;tex&amp;gt;d_{uv}&amp;lt;/tex&amp;gt; сразу после &amp;lt;tex&amp;gt;i - 1&amp;lt;/tex&amp;gt; итерации.&lt;br /&gt;
&amp;lt;tex&amp;gt; d_{uv} \le d_{uv}^{(i)} &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим два случая:&lt;br /&gt;
* Значение &amp;lt;tex&amp;gt; d_{uv}^{(i)} &amp;lt;/tex&amp;gt; стало меньше, чем &amp;lt;tex&amp;gt; d_{uv}^{(i - 1)} &amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt; d_{uv}^{(i)} = d_{ui}^{(i-1)} + d_{iv}^{(i-1)} \ge &amp;lt;/tex&amp;gt; (выполняется на шаге &amp;lt;tex&amp;gt; i - 1 &amp;lt;/tex&amp;gt;, по индукционному  предположению) &amp;lt;tex&amp;gt; \ge d'_{ui}  + d'_{iv} \ge&amp;lt;/tex&amp;gt; (в силу выполнения 7-ой строчки алгоритма на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой итерации и невозрастания элементов массива &amp;lt;tex&amp;gt; d &amp;lt;/tex&amp;gt;) &amp;lt;tex&amp;gt;\ge d_{uv}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* В ином случае всё очевидно: &amp;lt;tex&amp;gt; d_{uv}^{(i)} = d_{uv}^{(i - 1)} \ge d_{uv} &amp;lt;/tex&amp;gt;, и неравенство тривиально.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Докажем первое неравенство от противного.'''&lt;br /&gt;
&lt;br /&gt;
Пусть неравенство было нарушено, рассмотрим момент, когда оно было нарушено впервые. Пусть это была &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ая итерация и в этот момент изменилось значение &amp;lt;tex&amp;gt;d_{uv}&amp;lt;/tex&amp;gt; и выполнилось  &amp;lt;tex&amp;gt;\rho(u,v) &amp;gt; d_{uv}&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;d_{uv}&amp;lt;/tex&amp;gt; изменилось, то &amp;lt;tex&amp;gt;d_{uv} = d_{ui} + d_{iv} \ge&amp;lt;/tex&amp;gt; (так как ранее &amp;lt;tex&amp;gt;\forall u, v \in V: \rho(u,v) \le d_{uv}&amp;lt;/tex&amp;gt;) &amp;lt;tex&amp;gt;\ge \rho(u, i) + \rho(i, v) \ge&amp;lt;/tex&amp;gt; (по неравенству треугольника) &amp;lt;tex&amp;gt;\ge \rho(u, v)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Итак &amp;lt;tex&amp;gt;d_{uv} \ge \rho(u,v)&amp;lt;/tex&amp;gt; {{---}} противоречие.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
  # Инициализация&lt;br /&gt;
  &amp;lt;tex dpi = &amp;quot;105&amp;quot;&amp;gt; d = w &amp;lt;/tex&amp;gt; &lt;br /&gt;
  # Основная часть&lt;br /&gt;
  for i in {1..n}:&lt;br /&gt;
    for u in {1..n}:&lt;br /&gt;
      for v in {1..n}:&lt;br /&gt;
        &amp;lt;tex dpi = &amp;quot;105&amp;quot;&amp;gt; d_{uv} = min(d_{uv}, d_{ui} + d_{iv}) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная реализация работает за время &amp;lt;tex&amp;gt; \Theta(n^3) &amp;lt;/tex&amp;gt;, но требует уже &amp;lt;tex&amp;gt; \Theta(n^2) &amp;lt;/tex&amp;gt; памяти. В целом, алгоритм Флойда очень прост, и, поскольку в нем используются только простые операции, константа, скрытая в определении &amp;lt;tex&amp;gt; \Theta &amp;lt;/tex&amp;gt; весьма мала.&lt;br /&gt;
&lt;br /&gt;
=== Пример работы ===&lt;br /&gt;
{|style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
| &amp;lt;tex&amp;gt;i = 0&amp;lt;/tex&amp;gt; ||  &amp;lt;tex&amp;gt;i = 1&amp;lt;/tex&amp;gt; ||  &amp;lt;tex&amp;gt;i = 2&amp;lt;/tex&amp;gt; ||  &amp;lt;tex&amp;gt;i = 3 &amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;i = 4&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [[Файл:Floyd_step0.png]] || [[Файл:Floyd_step1.png]] || [[Файл:Floyd_step2.png]] || [[Файл:Floyd_step3.png]] || [[Файл:Floyd_step4.png]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;\begin{pmatrix}&lt;br /&gt;
\times &amp;amp; 1 &amp;amp; 6 &amp;amp; \infty \\&lt;br /&gt;
\infty &amp;amp; \times &amp;amp; 4 &amp;amp; 1 \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; \times &amp;amp; \infty \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; 1 &amp;amp; \times \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 || &amp;lt;tex&amp;gt;\begin{pmatrix}&lt;br /&gt;
\times &amp;amp; 1 &amp;amp; 6 &amp;amp; \infty \\&lt;br /&gt;
\infty &amp;amp; \times &amp;amp; 4 &amp;amp; 1 \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; \times &amp;amp; \infty \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; 1 &amp;amp; \times \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 || &amp;lt;tex&amp;gt;\begin{pmatrix}&lt;br /&gt;
\times &amp;amp; 1 &amp;amp; \bf{5} &amp;amp; \bf{2} \\&lt;br /&gt;
\infty &amp;amp; \times &amp;amp; 4 &amp;amp; 1 \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; \times &amp;amp; \infty \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; 1 &amp;amp; \times \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 || &amp;lt;tex&amp;gt;\begin{pmatrix}&lt;br /&gt;
\times &amp;amp; 1 &amp;amp; 5 &amp;amp; 2 \\&lt;br /&gt;
\infty &amp;amp; \times &amp;amp; 4 &amp;amp; 1 \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; \times &amp;amp; \infty \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; 1 &amp;amp; \times \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 || &amp;lt;tex&amp;gt;\begin{pmatrix}&lt;br /&gt;
\times &amp;amp; 1 &amp;amp; \bf{3} &amp;amp; 2 \\&lt;br /&gt;
\infty &amp;amp; \times &amp;amp; \bf{2} &amp;amp; 1 \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; \times &amp;amp; \infty \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; 1 &amp;amp; \times \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Вывод кратчайшего пути ==&lt;br /&gt;
Алгоритм Флойда легко модифицировать таким образом, чтобы он возвращал не только длину кратчайшего пути, но и сам путь. Для этого достаточно завести дополнительный массив &amp;lt;tex&amp;gt;next_{uv}&amp;lt;/tex&amp;gt;, в котором будет храниться номер вершины, в которую надо пойти следующей, чтобы дойти из &amp;lt;tex&amp;gt;u&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;
  # Инициализация&lt;br /&gt;
  d = w&lt;br /&gt;
  t[u][v] = v если есть ребро uv&lt;br /&gt;
  # Основная часть&lt;br /&gt;
  for i in {1..n}:&lt;br /&gt;
    for u in {1..n}:&lt;br /&gt;
      for v in {1..n}:&lt;br /&gt;
        if (d[u][i] + d[i][v]) &amp;lt; d[u][v]: &lt;br /&gt;
          d[u][v] = d[u][i] + d[i][v]&lt;br /&gt;
          next[u][v] = next[u][i]&lt;br /&gt;
&lt;br /&gt;
  # Вывод кратчайшего пути&lt;br /&gt;
  def get_shortest_path(u, v):&lt;br /&gt;
    if d[u][v] == inf:&lt;br /&gt;
        raise NoPath # Из u в v пути нет&lt;br /&gt;
    c = u&lt;br /&gt;
    while c != v:&lt;br /&gt;
      print c&lt;br /&gt;
      c = next[c][v]&lt;br /&gt;
    print v&lt;br /&gt;
&lt;br /&gt;
[[Файл:Floyd_path.png]]&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>Chuprikov Pavel</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%A4%D0%BB%D0%BE%D0%B9%D0%B4%D0%B0&amp;diff=12855</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%BB%D0%BE%D0%B9%D0%B4%D0%B0&amp;diff=12855"/>
				<updated>2011-11-07T18:37:19Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: /* Код (окончательный) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Алгоритм Флойда (алгоритм Флойда–Уоршелла)''' {{---}} алгоритм нахождения длин кратчайших путей между всеми парами вершин во взвешенном ориентированном графе. Работает корректно, если в графе нет циклов отрицательной величины, а в случае, когда такой цикл есть, позволяет найти хотя бы один такой цикл. Этот алгоритм работает в течение времени &amp;lt;tex&amp;gt; \Theta(n^3) &amp;lt;/tex&amp;gt; и использует &amp;lt;tex&amp;gt; \Theta(n^2) &amp;lt;/tex&amp;gt; памяти. Разработан в 1962 году.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
[[Файл:Floyd.png|right|thumb|Текущий (синий) путь и потенциально более короткий (красный)]]&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;\omega_{uv} =&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\text{weight of }uv ,&amp;amp; \text{if } uv \in E \\&lt;br /&gt;
+\infty ,&amp;amp; \text{if } uv \notin E&lt;br /&gt;
\end{cases}&amp;lt;/tex&amp;gt;, в котором вершины пронумерованы от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;. Требуется найти матрицу кратчайших расстояний &amp;lt;tex&amp;gt; d &amp;lt;/tex&amp;gt;, в которой элемент &amp;lt;tex&amp;gt; d_{ij} &amp;lt;/tex&amp;gt; либо равен длине кратчайшего пути из &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;, либо равен &amp;lt;tex&amp;gt; +\infty &amp;lt;/tex&amp;gt;, если вершина &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; не достижима из &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&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;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, только вершины из множества &amp;lt;tex&amp;gt; \{ 1 .. i \} &amp;lt;/tex&amp;gt; как &amp;lt;tex&amp;gt;d_{uv}^{(i)}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;d_{uv}^{(0)} = \omega_{uv}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге алгоритма, мы будем брать очередную вершину (пусть её номер {{---}} &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;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; d_{uv}^{(i)} = min(d_{uv}^{(i-1)}, d_{ui}^{(i-1)} + d_{iv}^{(i-1)}) &amp;lt;/tex&amp;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; \{ 1 .. i \} &amp;lt;/tex&amp;gt;, проходит через вершину &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;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; u &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, объединенный с кратчайшим путем из &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;. В противном случае, когда этот путь не содержит вершины &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;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; \{ 1 .. i \} &amp;lt;/tex&amp;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; \{ 1 .. i-1 \} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Код (в первом приближении) ===&lt;br /&gt;
  # Инициализация&lt;br /&gt;
  &amp;lt;tex dpi = &amp;quot;105&amp;quot;&amp;gt; d^{(0)} = w &amp;lt;/tex&amp;gt;&lt;br /&gt;
  # Основная часть&lt;br /&gt;
  for i in {1..n}:&lt;br /&gt;
    for u in {1..n}:&lt;br /&gt;
      for v in {1..n}:&lt;br /&gt;
        &amp;lt;tex dpi = &amp;quot;105&amp;quot; &amp;gt; d^{(i)}_{uv} = min(d^{(i - 1)}_{uv}, d^{(i - 1)}_{ui} + d^{(i - 1)}_{iv}) &amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
В итоге получаем, что матрица &amp;lt;tex&amp;gt; d^{(n)} &amp;lt;/tex&amp;gt; и является искомой матрицей кратчайших путей, поскольку содержит в себе длины кратчайших путей между всеми парами вершин, имеющих в качестве промежуточных вершин вершины из множества &amp;lt;tex&amp;gt; \{ 1..n \} &amp;lt;/tex&amp;gt;, что есть попросту все вершины графа. Такая реализация работает за &amp;lt;tex&amp;gt; \Theta(n^3) &amp;lt;/tex&amp;gt; времени и использует &amp;lt;tex&amp;gt; \Theta(n^3) &amp;lt;/tex&amp;gt; памяти.&lt;br /&gt;
&lt;br /&gt;
=== Код (окончательный) ===&lt;br /&gt;
Утверждается, что можно избавиться от одной размерности в массиве &amp;lt;tex&amp;gt; d &amp;lt;/tex&amp;gt;, т.е. использовать двумерный массив &amp;lt;tex&amp;gt;d_{uv}&amp;lt;/tex&amp;gt;. В процессе работы алгоритма поддерживается инвариант &amp;lt;tex&amp;gt;\rho(u, v) \le d_{uv} \le d_{uv}^{(i)}&amp;lt;/tex&amp;gt;, а, поскольку, после выполнения работы алгоритма &amp;lt;tex&amp;gt; \rho(u, v) == d_{uv}^{(i)} &amp;lt;/tex&amp;gt;, то тогда будет выполняться и &amp;lt;tex&amp;gt; \rho(u, v) == d_{uv} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
В течение работы алгоритма Флойда выполняются неравенства: &amp;lt;tex&amp;gt;\rho(u, v) \le d_{uv} \le d_{uv}^{(i)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
После инициализации все неравенства, очевидно, выполняются. Далее, массив &amp;lt;tex&amp;gt; d &amp;lt;/tex&amp;gt; может измениться только в строчке 5. &lt;br /&gt;
&lt;br /&gt;
'''Докажем второе неравенство индукцией по итерациям алгоритма.'''&lt;br /&gt;
&lt;br /&gt;
Пусть также &amp;lt;tex&amp;gt;d'_{uv}&amp;lt;/tex&amp;gt; - значение &amp;lt;tex&amp;gt;d_{uv}&amp;lt;/tex&amp;gt; сразу после &amp;lt;tex&amp;gt;i - 1&amp;lt;/tex&amp;gt; итерации.&lt;br /&gt;
&amp;lt;tex&amp;gt; d_{uv} \le d_{uv}^{(i)} &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Рассмотрим два случая:&lt;br /&gt;
* Значение &amp;lt;tex&amp;gt; d_{uv}^{(i)} &amp;lt;/tex&amp;gt; стало меньше, чем &amp;lt;tex&amp;gt; d_{uv}^{(i - 1)} &amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt; d_{uv}^{(i)} = d_{ui}^{(i-1)} + d_{iv}^{(i-1)} \ge &amp;lt;/tex&amp;gt; (выполняется на шаге &amp;lt;tex&amp;gt; i - 1 &amp;lt;/tex&amp;gt;, по индукционному  предположению) &amp;lt;tex&amp;gt; \ge d'_{ui}  + d'_{iv} \ge&amp;lt;/tex&amp;gt; (в силу выполнения 7-ой строчки алгоритма на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой итерации и невозрастания элементов массива &amp;lt;tex&amp;gt; d &amp;lt;/tex&amp;gt;) &amp;lt;tex&amp;gt;\ge d_{uv}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* В ином случае всё очевидно: &amp;lt;tex&amp;gt; d_{uv}^{(i)} = d_{uv}^{(i - 1)} \ge d_{uv} &amp;lt;/tex&amp;gt;, и неравенство тривиально.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Докажем первое неравнство от противного.'''&lt;br /&gt;
&lt;br /&gt;
Пусть неравенство было нарушено. рассмотрим момент, когда оно было нарушено впервые. Пусть это была &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ая итерация и в этот момент изменилось значение &amp;lt;tex&amp;gt;d_{uv}&amp;lt;/tex&amp;gt; и выполнилось  &amp;lt;tex&amp;gt;\rho(u,v) &amp;gt; d_{uv}&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;d_{uv}&amp;lt;/tex&amp;gt; изменилось, то &amp;lt;tex&amp;gt;d_{uv} = d_{ui} + d_{iv} \ge&amp;lt;/tex&amp;gt; (так как ранее &amp;lt;tex&amp;gt;\forall u, v \in V: \rho(u,v) \le d_{uv}&amp;lt;/tex&amp;gt;) &amp;lt;tex&amp;gt;\ge \rho(u, i) + \rho(i, v) \ge&amp;lt;/tex&amp;gt; (по неравенству треугольника) &amp;lt;tex&amp;gt;\ge \rho(u, v)&amp;lt;/tex&amp;gt;. &lt;br /&gt;
Итак &amp;lt;tex&amp;gt;d_{uv} \ge \rho(u,v)&amp;lt;/tex&amp;gt; {{---}} противоречие.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
  # Инициализация&lt;br /&gt;
  &amp;lt;tex dpi = &amp;quot;105&amp;quot;&amp;gt; d = w &amp;lt;/tex&amp;gt; &lt;br /&gt;
  # Основная часть&lt;br /&gt;
  for i in {1..n}:&lt;br /&gt;
    for u in {1..n}:&lt;br /&gt;
      for v in {1..n}:&lt;br /&gt;
        &amp;lt;tex dpi = &amp;quot;105&amp;quot;&amp;gt; d_{uv} = min(d_{uv}, d_{ui} + d_{iv}) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная реализация работает за время &amp;lt;tex&amp;gt; \Theta(n^3) &amp;lt;/tex&amp;gt;, но требует уже &amp;lt;tex&amp;gt; \Theta(n^2) &amp;lt;/tex&amp;gt; памяти. В целом, алгоритм Флойда очень прост, и, поскольку в нем используются только простые операции, константа, скрытая в определении &amp;lt;tex&amp;gt; \Theta &amp;lt;/tex&amp;gt; весьма мала.&lt;br /&gt;
&lt;br /&gt;
=== Пример работы ===&lt;br /&gt;
{|style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
| &amp;lt;tex&amp;gt;i = 0&amp;lt;/tex&amp;gt; ||  &amp;lt;tex&amp;gt;i = 1&amp;lt;/tex&amp;gt; ||  &amp;lt;tex&amp;gt;i = 2&amp;lt;/tex&amp;gt; ||  &amp;lt;tex&amp;gt;i = 3 &amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;i = 4&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [[Файл:Floyd_step0.png]] || [[Файл:Floyd_step1.png]] || [[Файл:Floyd_step2.png]] || [[Файл:Floyd_step3.png]] || [[Файл:Floyd_step4.png]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;\begin{pmatrix}&lt;br /&gt;
\times &amp;amp; 1 &amp;amp; 6 &amp;amp; \infty \\&lt;br /&gt;
\infty &amp;amp; \times &amp;amp; 4 &amp;amp; 1 \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; \times &amp;amp; \infty \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; 1 &amp;amp; \times \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 || &amp;lt;tex&amp;gt;\begin{pmatrix}&lt;br /&gt;
\times &amp;amp; 1 &amp;amp; 6 &amp;amp; \infty \\&lt;br /&gt;
\infty &amp;amp; \times &amp;amp; 4 &amp;amp; 1 \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; \times &amp;amp; \infty \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; 1 &amp;amp; \times \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 || &amp;lt;tex&amp;gt;\begin{pmatrix}&lt;br /&gt;
\times &amp;amp; 1 &amp;amp; \bf{5} &amp;amp; \bf{2} \\&lt;br /&gt;
\infty &amp;amp; \times &amp;amp; 4 &amp;amp; 1 \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; \times &amp;amp; \infty \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; 1 &amp;amp; \times \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 || &amp;lt;tex&amp;gt;\begin{pmatrix}&lt;br /&gt;
\times &amp;amp; 1 &amp;amp; 5 &amp;amp; 2 \\&lt;br /&gt;
\infty &amp;amp; \times &amp;amp; 4 &amp;amp; 1 \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; \times &amp;amp; \infty \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; 1 &amp;amp; \times \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 || &amp;lt;tex&amp;gt;\begin{pmatrix}&lt;br /&gt;
\times &amp;amp; 1 &amp;amp; \bf{3} &amp;amp; 2 \\&lt;br /&gt;
\infty &amp;amp; \times &amp;amp; \bf{2} &amp;amp; 1 \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; \times &amp;amp; \infty \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; 1 &amp;amp; \times \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Вывод кратчайшего пути ==&lt;br /&gt;
Алгоритм Флойда легко модифицировать таким образом, чтобы он возвращал не только длину кратчайшего пути, но и сам путь. Для этого достаточно завести дополнительный массив &amp;lt;tex&amp;gt;next_{uv}&amp;lt;/tex&amp;gt;, в котором будет храниться номер вершины, в которую надо пойти следующей, чтобы дойти из &amp;lt;tex&amp;gt;u&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;
  # Инициализация&lt;br /&gt;
  d = w&lt;br /&gt;
  t[u][v] = v если есть ребро uv&lt;br /&gt;
  # Основная часть&lt;br /&gt;
  for i in {1..n}:&lt;br /&gt;
    for u in {1..n}:&lt;br /&gt;
      for v in {1..n}:&lt;br /&gt;
        if (d[u][i] + d[i][v]) &amp;lt; d[u][v]: &lt;br /&gt;
          d[u][v] = d[u][i] + d[i][v]&lt;br /&gt;
          next[u][v] = next[u][i]&lt;br /&gt;
&lt;br /&gt;
  # Вывод кратчайшего пути&lt;br /&gt;
  def get_shortest_path(u, v):&lt;br /&gt;
    if d[u][v] == inf:&lt;br /&gt;
        raise NoPath # Из u в v пути нет&lt;br /&gt;
    c = u&lt;br /&gt;
    while c != v:&lt;br /&gt;
      print c&lt;br /&gt;
      c = next[c][v]&lt;br /&gt;
    print v&lt;br /&gt;
&lt;br /&gt;
[[Файл:Floyd_path.png]]&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>Chuprikov Pavel</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%A4%D0%BB%D0%BE%D0%B9%D0%B4%D0%B0&amp;diff=12854</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%BB%D0%BE%D0%B9%D0%B4%D0%B0&amp;diff=12854"/>
				<updated>2011-11-07T18:12:50Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: /* Код (окончательный) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Алгоритм Флойда (алгоритм Флойда–Уоршелла)''' {{---}} алгоритм нахождения длин кратчайших путей между всеми парами вершин во взвешенном ориентированном графе. Работает корректно, если в графе нет циклов отрицательной величины, а в случае, когда такой цикл есть, позволяет найти хотя бы один такой цикл. Этот алгоритм работает в течение времени &amp;lt;tex&amp;gt; \Theta(n^3) &amp;lt;/tex&amp;gt; и использует &amp;lt;tex&amp;gt; \Theta(n^2) &amp;lt;/tex&amp;gt; памяти. Разработан в 1962 году.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
[[Файл:Floyd.png|right|thumb|Текущий (синий) путь и потенциально более короткий (красный)]]&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;\omega_{uv} =&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\text{weight of }uv ,&amp;amp; \text{if } uv \in E \\&lt;br /&gt;
+\infty ,&amp;amp; \text{if } uv \notin E&lt;br /&gt;
\end{cases}&amp;lt;/tex&amp;gt;, в котором вершины пронумерованы от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;. Требуется найти матрицу кратчайших расстояний &amp;lt;tex&amp;gt; d &amp;lt;/tex&amp;gt;, в которой элемент &amp;lt;tex&amp;gt; d_{ij} &amp;lt;/tex&amp;gt; либо равен длине кратчайшего пути из &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;, либо равен &amp;lt;tex&amp;gt; +\infty &amp;lt;/tex&amp;gt;, если вершина &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; не достижима из &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&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;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, только вершины из множества &amp;lt;tex&amp;gt; \{ 1 .. i \} &amp;lt;/tex&amp;gt; как &amp;lt;tex&amp;gt;d_{uv}^{(i)}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;d_{uv}^{(0)} = \omega_{uv}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге алгоритма, мы будем брать очередную вершину (пусть её номер {{---}} &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;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; d_{uv}^{(i)} = min(d_{uv}^{(i-1)}, d_{ui}^{(i-1)} + d_{iv}^{(i-1)}) &amp;lt;/tex&amp;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; \{ 1 .. i \} &amp;lt;/tex&amp;gt;, проходит через вершину &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;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; u &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, объединенный с кратчайшим путем из &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;. В противном случае, когда этот путь не содержит вершины &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;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; \{ 1 .. i \} &amp;lt;/tex&amp;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; \{ 1 .. i-1 \} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Код (в первом приближении) ===&lt;br /&gt;
  # Инициализация&lt;br /&gt;
  &amp;lt;tex dpi = &amp;quot;105&amp;quot;&amp;gt; d^{(0)} = w &amp;lt;/tex&amp;gt;&lt;br /&gt;
  # Основная часть&lt;br /&gt;
  for i in {1..n}:&lt;br /&gt;
    for u in {1..n}:&lt;br /&gt;
      for v in {1..n}:&lt;br /&gt;
        &amp;lt;tex dpi = &amp;quot;105&amp;quot; &amp;gt; d^{(i)}_{uv} = min(d^{(i - 1)}_{uv}, d^{(i - 1)}_{ui} + d^{(i - 1)}_{iv}) &amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
В итоге получаем, что матрица &amp;lt;tex&amp;gt; d^{(n)} &amp;lt;/tex&amp;gt; и является искомой матрицей кратчайших путей, поскольку содержит в себе длины кратчайших путей между всеми парами вершин, имеющих в качестве промежуточных вершин вершины из множества &amp;lt;tex&amp;gt; \{ 1..n \} &amp;lt;/tex&amp;gt;, что есть попросту все вершины графа. Такая реализация работает за &amp;lt;tex&amp;gt; \Theta(n^3) &amp;lt;/tex&amp;gt; времени и использует &amp;lt;tex&amp;gt; \Theta(n^3) &amp;lt;/tex&amp;gt; памяти.&lt;br /&gt;
&lt;br /&gt;
=== Код (окончательный) ===&lt;br /&gt;
Утверждается, что можно избавиться от одной размерности в массиве &amp;lt;tex&amp;gt; d &amp;lt;/tex&amp;gt;, т.е. использовать двумерный массив &amp;lt;tex&amp;gt;d_{uv}&amp;lt;/tex&amp;gt;. В процессе работы алгоритма поддерживается инвариант &amp;lt;tex&amp;gt;\rho(u, v) \le d_{uv} \le d_{uv}^{(i)}&amp;lt;/tex&amp;gt;, а, поскольку, после выполнения работы алгоритма &amp;lt;tex&amp;gt; \rho(u, v) == d_{uv}^{(i)} &amp;lt;/tex&amp;gt;, то тогда будет выполняться и &amp;lt;tex&amp;gt; \rho(u, v) == d_{uv} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
В течение работы алгоритма Флойда выполняются неравенства: &amp;lt;tex&amp;gt;\rho(u, v) \le d_{uv} \le d_{uv}^{(i)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
После инициализации все неравенства, очевидно, выполняются. Далее, массив &amp;lt;tex&amp;gt; d &amp;lt;/tex&amp;gt; может измениться только в строчке 5. Докажем оба неравенства индукцией по итерациям алгоритма.  Пусть также &amp;lt;tex&amp;gt;d'_{uv}&amp;lt;/tex&amp;gt; - значение &amp;lt;tex&amp;gt;d_{uv}&amp;lt;/tex&amp;gt; сразу после &amp;lt;tex&amp;gt;i - 1&amp;lt;/tex&amp;gt; итерации.&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tex&amp;gt; \rho(u, v) \le d_{uv} &amp;lt;/tex&amp;gt;. Рассмотрим два случая:&lt;br /&gt;
#* Значение &amp;lt;tex&amp;gt; d_{uv} &amp;lt;/tex&amp;gt; изменилось. Тогда &amp;lt;tex&amp;gt; d_{uv} = d_{ui} + d_{iv} \ge \rho(u, i) + \rho(i, v) \ge \rho(u, v) &amp;lt;/tex&amp;gt; (по индукционному предположению и неравенству треугольника для &amp;lt;tex&amp;gt; \rho &amp;lt;/tex&amp;gt;).&lt;br /&gt;
#* Значение &amp;lt;tex&amp;gt; d_{uv} &amp;lt;/tex&amp;gt; не изменилось. Тогда неравенство выполняется автоматически по индукционному предположению.&lt;br /&gt;
# &amp;lt;tex&amp;gt; d_{uv} \le d_{uv}^{(i)} &amp;lt;/tex&amp;gt;. Аналогично рассмотрим два случая:&lt;br /&gt;
#* Значение &amp;lt;tex&amp;gt; d_{uv}^{(i)} &amp;lt;/tex&amp;gt; стало меньше, чем &amp;lt;tex&amp;gt; d_{uv}^{(i - 1)} &amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt; d_{uv}^{(i)} = d_{ui}^{(i-1)} + d_{iv}^{(i-1)} \ge &amp;lt;/tex&amp;gt; (выполняется на шаге &amp;lt;tex&amp;gt; i - 1 &amp;lt;/tex&amp;gt;, по индукционному предположению) &amp;lt;tex&amp;gt; \ge d'_{ui}  + d'_{iv} \ge&amp;lt;/tex&amp;gt; (в силу выполнения 7-ой строчки алгоритма на &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;gt;-ой итерации и невозрастания элементов массива &amp;lt;tex&amp;gt; d &amp;lt;/tex&amp;gt;) &amp;lt;tex&amp;gt;\ge d_{uv}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
#* В ином случае всё очевидно: &amp;lt;tex&amp;gt; d_{uv}^{(i)} = d_{uv}^{(i - 1)} \ge d_{uv} &amp;lt;/tex&amp;gt;, и неравенство тривиально.&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
  # Инициализация&lt;br /&gt;
  &amp;lt;tex dpi = &amp;quot;105&amp;quot;&amp;gt; d = w &amp;lt;/tex&amp;gt; &lt;br /&gt;
  # Основная часть&lt;br /&gt;
  for i in {1..n}:&lt;br /&gt;
    for u in {1..n}:&lt;br /&gt;
      for v in {1..n}:&lt;br /&gt;
        &amp;lt;tex dpi = &amp;quot;105&amp;quot;&amp;gt; d_{uv} = min(d_{uv}, d_{ui} + d_{iv}) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная реализация работает за время &amp;lt;tex&amp;gt; \Theta(n^3) &amp;lt;/tex&amp;gt;, но требует уже &amp;lt;tex&amp;gt; \Theta(n^2) &amp;lt;/tex&amp;gt; памяти. В целом, алгоритм Флойда очень прост, и, поскольку в нем используются только простые операции, константа, скрытая в определении &amp;lt;tex&amp;gt; \Theta &amp;lt;/tex&amp;gt; весьма мала.&lt;br /&gt;
&lt;br /&gt;
=== Пример работы ===&lt;br /&gt;
{|style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
| &amp;lt;tex&amp;gt;i = 0&amp;lt;/tex&amp;gt; ||  &amp;lt;tex&amp;gt;i = 1&amp;lt;/tex&amp;gt; ||  &amp;lt;tex&amp;gt;i = 2&amp;lt;/tex&amp;gt; ||  &amp;lt;tex&amp;gt;i = 3 &amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;i = 4&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [[Файл:Floyd_step0.png]] || [[Файл:Floyd_step1.png]] || [[Файл:Floyd_step2.png]] || [[Файл:Floyd_step3.png]] || [[Файл:Floyd_step4.png]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;\begin{pmatrix}&lt;br /&gt;
\times &amp;amp; 1 &amp;amp; 6 &amp;amp; \infty \\&lt;br /&gt;
\infty &amp;amp; \times &amp;amp; 4 &amp;amp; 1 \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; \times &amp;amp; \infty \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; 1 &amp;amp; \times \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 || &amp;lt;tex&amp;gt;\begin{pmatrix}&lt;br /&gt;
\times &amp;amp; 1 &amp;amp; 6 &amp;amp; \infty \\&lt;br /&gt;
\infty &amp;amp; \times &amp;amp; 4 &amp;amp; 1 \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; \times &amp;amp; \infty \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; 1 &amp;amp; \times \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 || &amp;lt;tex&amp;gt;\begin{pmatrix}&lt;br /&gt;
\times &amp;amp; 1 &amp;amp; \bf{5} &amp;amp; \bf{2} \\&lt;br /&gt;
\infty &amp;amp; \times &amp;amp; 4 &amp;amp; 1 \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; \times &amp;amp; \infty \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; 1 &amp;amp; \times \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 || &amp;lt;tex&amp;gt;\begin{pmatrix}&lt;br /&gt;
\times &amp;amp; 1 &amp;amp; 5 &amp;amp; 2 \\&lt;br /&gt;
\infty &amp;amp; \times &amp;amp; 4 &amp;amp; 1 \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; \times &amp;amp; \infty \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; 1 &amp;amp; \times \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 || &amp;lt;tex&amp;gt;\begin{pmatrix}&lt;br /&gt;
\times &amp;amp; 1 &amp;amp; \bf{3} &amp;amp; 2 \\&lt;br /&gt;
\infty &amp;amp; \times &amp;amp; \bf{2} &amp;amp; 1 \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; \times &amp;amp; \infty \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; 1 &amp;amp; \times \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Вывод кратчайшего пути ==&lt;br /&gt;
Алгоритм Флойда легко модифицировать таким образом, чтобы он возвращал не только длину кратчайшего пути, но и сам путь. Для этого достаточно завести дополнительный массив &amp;lt;tex&amp;gt;next_{uv}&amp;lt;/tex&amp;gt;, в котором будет храниться номер вершины, в которую надо пойти следующей, чтобы дойти из &amp;lt;tex&amp;gt;u&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;
  # Инициализация&lt;br /&gt;
  d = w&lt;br /&gt;
  t[u][v] = v если есть ребро uv&lt;br /&gt;
  # Основная часть&lt;br /&gt;
  for i in {1..n}:&lt;br /&gt;
    for u in {1..n}:&lt;br /&gt;
      for v in {1..n}:&lt;br /&gt;
        if (d[u][i] + d[i][v]) &amp;lt; d[u][v]: &lt;br /&gt;
          d[u][v] = d[u][i] + d[i][v]&lt;br /&gt;
          next[u][v] = next[u][i]&lt;br /&gt;
&lt;br /&gt;
  # Вывод кратчайшего пути&lt;br /&gt;
  def get_shortest_path(u, v):&lt;br /&gt;
    if d[u][v] == inf:&lt;br /&gt;
        raise NoPath # Из u в v пути нет&lt;br /&gt;
    c = u&lt;br /&gt;
    while c != v:&lt;br /&gt;
      print c&lt;br /&gt;
      c = next[c][v]&lt;br /&gt;
    print v&lt;br /&gt;
&lt;br /&gt;
[[Файл:Floyd_path.png]]&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>Chuprikov Pavel</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%94%D0%B6%D0%BE%D0%BD%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=12670</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%94%D0%B6%D0%BE%D0%BD%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=12670"/>
				<updated>2011-11-03T17:42:25Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: /* Псевдокод */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Алгоритм Джонсона''' находит кратчайшие пути между всеми парами вершин взвешенного ориентированного графа с положительными или отрицательными ребрами, но не имеющем отрицательных циклов.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
&lt;br /&gt;
=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Джонсона позволяет найти кратчайшие пути между всеми парами вершин в течение времени &amp;lt;tex&amp;gt; O(V^2 * \log(V) + VE) &amp;lt;/tex&amp;gt;. Для разреженных графов этот алгоритм ведет себя асимптотически быстрее алгоритма Флойда. Этот алгоритм либо возвращает матрицу кратчайших расстояний между всеми парами вершин, либо сообщение о том, что в графе существует цикл отрицательной длины.&lt;br /&gt;
&lt;br /&gt;
В этом алгоритме используется метод '''изменения веса''' (англ. reweighting). Суть его заключается в том, что для заданного графа &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; строится новая весовая функция &amp;lt;tex&amp;gt; \hat{\omega} &amp;lt;/tex&amp;gt;, неотрицательная для всех ребер графа &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; и сохраняющая кратчайшие пути. Такая весовая функция строится при помощи так называемой '''потенциальной''' функции.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; \varphi : V \rightarrow \mathbb R &amp;lt;/tex&amp;gt; - произвольное отображение из множества вершин в вещественные числа. Тогда новой весовой функцией будет &amp;lt;tex&amp;gt; \omega_\varphi(u, v) = \omega(u, v) + \varphi(u) - \varphi(v) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}} &lt;br /&gt;
&lt;br /&gt;
Такая потенциальная функция строится при помощи добавлении фиктивной вершины в &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; и запуском алгоритма Форда-Беллмана из нее. На этом же этапе мы сможем обнаружить наличие отрицательного цикла в графе.&lt;br /&gt;
&lt;br /&gt;
Теперь, когда мы знаем, что веса всех ребер неотрицательны, и кратчайшие пути сохранятся, можно запустить алгоритм Дейкстры из каждой вершины и таким образом найти кратчайшие расстояния между всеми парами вершин.&lt;br /&gt;
&lt;br /&gt;
=== Сохранение кратчайших путей ===&lt;br /&gt;
Утверждается, что если какой-то путь &amp;lt;tex&amp;gt; P &amp;lt;/tex&amp;gt; был кратчайшим относительно весовой функции &amp;lt;tex&amp;gt; \omega &amp;lt;/tex&amp;gt;, то он будет кратчайшим и относительно новой весовой функции &amp;lt;tex&amp;gt; \hat{\omega} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;P,\; Q : a \rightsquigarrow b\;&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;w(P) &amp;lt; w(Q).&amp;lt;/tex&amp;gt; Тогда &amp;lt;tex&amp;gt;\forall \varphi: \; w_\varphi(P) &amp;lt; w_\varphi(Q)&amp;lt;/tex&amp;gt; &lt;br /&gt;
|proof=&lt;br /&gt;
:&amp;lt;tex&amp;gt;P: \;u_0 \rightarrow u_1 \rightarrow u_2 \rightarrow ... \rightarrow u_k &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;w_\varphi(P) = w_\varphi(u_0u_1) + w_\varphi(u_1u_2) + ... + w_\varphi(u_{k-1}u_k) = \varphi(u_0) + w(u_0u_1) - \varphi(u_1) + ... + \varphi(u_{k-1}) + w(u_{k-1}u_k) - \varphi(u_k) = \varphi(u_0) + w(P) - \varphi(u_k)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;w(P) &amp;lt; w(Q)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;w_\varphi(P) = \varphi(a) + w(P) - \varphi(b)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;w_\varphi(Q) = \varphi(a) + w(Q) - \varphi(b)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Отсюда, &amp;lt;tex&amp;gt;w_\varphi(P) &amp;lt; w_\varphi(Q)&amp;lt;/tex&amp;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;G&amp;lt;/tex&amp;gt; нет отрицательных циклов &amp;lt;tex&amp;gt;\Leftrightarrow&amp;lt;/tex&amp;gt; существует потенциальная функция &amp;lt;tex&amp;gt; \phi:\; \forall uv \in E\; w_\varphi(uv) \ge 0 &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;\Leftarrow &amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; - цикл в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;w(C) = w_\varphi(C) - \sum\limits_{uv \in C}  (\varphi(u) - \varphi(v))= w_\varphi(C) \ge 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\Rightarrow &amp;lt;/tex&amp;gt;: Добавим вершину &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в граф, соединим её со всеми вершинами графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; ребрами весом &amp;lt;tex&amp;gt;w = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:''Обозначение'' : &amp;lt;tex&amp;gt;\delta(i,\;j)&amp;lt;/tex&amp;gt; - минимальное расстояние между вершинами &amp;lt;tex&amp;gt;i,\; j&amp;lt;/tex&amp;gt; графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\phi(u) = \delta(s,\;u)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;w_\phi(uv) = \phi(u) + w(uv) - \phi(v) = \delta(s,\;u) + w(uv) - \delta(s,\;v)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\delta(s,\;u) + w(uv) = &amp;lt;/tex&amp;gt; {какой-то путь &amp;lt;tex&amp;gt;s \rightsquigarrow v&amp;lt;/tex&amp;gt;}.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\delta(s,\;v) =&amp;lt;/tex&amp;gt; {минимальный путь &amp;lt;tex&amp;gt;s \rightsquigarrow v&amp;lt;/tex&amp;gt;}.&lt;br /&gt;
&lt;br /&gt;
:Следовательно, &amp;lt;tex&amp;gt;w_\phi(uv) \ge 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;G' = (V',\;E')&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V' = V \cup \{s\}&amp;lt;/tex&amp;gt;, &lt;br /&gt;
 для некоторой новой вершины &amp;lt;tex&amp;gt;s \not\in V&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;E' = E \cup \{(s,\;v): \omega(s, v) = 0,\ v \in V \}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 '''if''' Bellman_Ford&amp;lt;tex&amp;gt;(G',\;\omega,\;s)&amp;lt;/tex&amp;gt; == FALSE&lt;br /&gt;
    '''then''' out &amp;lt;&amp;lt; «Входной граф содержит цикл с отрицательным весом»&lt;br /&gt;
    '''else''' '''for''' для каждой &amp;lt;tex&amp;gt;v \in V'&amp;lt;/tex&amp;gt;&lt;br /&gt;
         '''do''' присвоить величине &amp;lt;tex&amp;gt;\varphi(v)&amp;lt;/tex&amp;gt; значение &amp;lt;tex&amp;gt;\delta(s,\;v)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
            вычисленное алгоритмом Беллмана — Форда&lt;br /&gt;
         '''for''' для каждого ребра &amp;lt;tex&amp;gt;(u,\;v) \in E'&amp;lt;/tex&amp;gt;&lt;br /&gt;
             '''do''' &amp;lt;tex&amp;gt;w_\varphi(u,\;v) \leftarrow w(u,\;v) + \varphi(u) - \varphi(v)&amp;lt;/tex&amp;gt;&lt;br /&gt;
         '''for''' для каждой вершины &amp;lt;tex&amp;gt;u \in V&amp;lt;/tex&amp;gt;&lt;br /&gt;
             '''do''' вычисление с помощью алгоритма Дейкстры&lt;br /&gt;
             &amp;lt;tex&amp;gt;(G,\;w_\varphi,\;u)&amp;lt;/tex&amp;gt; величин &amp;lt;tex&amp;gt;\delta_\varphi(u,\;v)&amp;lt;/tex&amp;gt;&lt;br /&gt;
             для всех вершин &amp;lt;tex&amp;gt;v \in V&amp;lt;/tex&amp;gt;&lt;br /&gt;
             '''for''' для каждой вершины &amp;lt;tex&amp;gt;v \in V&amp;lt;/tex&amp;gt;&lt;br /&gt;
                 '''do''' &amp;lt;tex&amp;gt;d_{uv} \leftarrow \delta_\varphi(u,\;v) + \varphi(v) - \varphi(u)&amp;lt;/tex&amp;gt;&lt;br /&gt;
    '''return''' &amp;lt;tex&amp;gt;d&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;O(VE + VD)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;O(D)&amp;lt;/tex&amp;gt; - время работы [[Алгоритм Дейкстры| алгоритма Дейкстры]]. Если в алгоритме Дейкстры неубывающая очередь с приоритетами реализована в виде [http://ru.wikipedia.org/wiki/%D0%A4%D0%B8%D0%B1%D0%BE%D0%BD%D0%B0%D1%87%D1%87%D0%B8%D0%B5%D0%B2%D0%B0_%D0%BA%D1%83%D1%87%D0%B0 фибоначчиевой кучи], то время работы алгоритма Джонсона равно &amp;lt;tex&amp;gt;O(V^2\log V + V E)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Алгоритм Дейкстры]]&lt;br /&gt;
* [[Алгоритм Форда-Беллмана]]&lt;br /&gt;
* [[Алгоритм Флойда]]&lt;br /&gt;
* [http://rain.ifmo.ru/cat/view.php/vis/graph-paths/johnson-2001 Визуализатор алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* ''Кормен Т., Лейзерсон Ч., Ривест Р.'' Алгоритмы: построение и анализ.[http://wmate.ru/ebooks/?dl=380&amp;amp;mirror=1] — 2-е изд. — М.: Издательский дом «Вильямс», 2007. — С. 1296.&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Кратчайшие пути в графах ]]&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</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%94%D0%B6%D0%BE%D0%BD%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=12669</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%94%D0%B6%D0%BE%D0%BD%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=12669"/>
				<updated>2011-11-03T17:42:02Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: /* Псевдокод */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Алгоритм Джонсона''' находит кратчайшие пути между всеми парами вершин взвешенного ориентированного графа с положительными или отрицательными ребрами, но не имеющем отрицательных циклов.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
&lt;br /&gt;
=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Джонсона позволяет найти кратчайшие пути между всеми парами вершин в течение времени &amp;lt;tex&amp;gt; O(V^2 * \log(V) + VE) &amp;lt;/tex&amp;gt;. Для разреженных графов этот алгоритм ведет себя асимптотически быстрее алгоритма Флойда. Этот алгоритм либо возвращает матрицу кратчайших расстояний между всеми парами вершин, либо сообщение о том, что в графе существует цикл отрицательной длины.&lt;br /&gt;
&lt;br /&gt;
В этом алгоритме используется метод '''изменения веса''' (англ. reweighting). Суть его заключается в том, что для заданного графа &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; строится новая весовая функция &amp;lt;tex&amp;gt; \hat{\omega} &amp;lt;/tex&amp;gt;, неотрицательная для всех ребер графа &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; и сохраняющая кратчайшие пути. Такая весовая функция строится при помощи так называемой '''потенциальной''' функции.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; \varphi : V \rightarrow \mathbb R &amp;lt;/tex&amp;gt; - произвольное отображение из множества вершин в вещественные числа. Тогда новой весовой функцией будет &amp;lt;tex&amp;gt; \omega_\varphi(u, v) = \omega(u, v) + \varphi(u) - \varphi(v) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}} &lt;br /&gt;
&lt;br /&gt;
Такая потенциальная функция строится при помощи добавлении фиктивной вершины в &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; и запуском алгоритма Форда-Беллмана из нее. На этом же этапе мы сможем обнаружить наличие отрицательного цикла в графе.&lt;br /&gt;
&lt;br /&gt;
Теперь, когда мы знаем, что веса всех ребер неотрицательны, и кратчайшие пути сохранятся, можно запустить алгоритм Дейкстры из каждой вершины и таким образом найти кратчайшие расстояния между всеми парами вершин.&lt;br /&gt;
&lt;br /&gt;
=== Сохранение кратчайших путей ===&lt;br /&gt;
Утверждается, что если какой-то путь &amp;lt;tex&amp;gt; P &amp;lt;/tex&amp;gt; был кратчайшим относительно весовой функции &amp;lt;tex&amp;gt; \omega &amp;lt;/tex&amp;gt;, то он будет кратчайшим и относительно новой весовой функции &amp;lt;tex&amp;gt; \hat{\omega} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;P,\; Q : a \rightsquigarrow b\;&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;w(P) &amp;lt; w(Q).&amp;lt;/tex&amp;gt; Тогда &amp;lt;tex&amp;gt;\forall \varphi: \; w_\varphi(P) &amp;lt; w_\varphi(Q)&amp;lt;/tex&amp;gt; &lt;br /&gt;
|proof=&lt;br /&gt;
:&amp;lt;tex&amp;gt;P: \;u_0 \rightarrow u_1 \rightarrow u_2 \rightarrow ... \rightarrow u_k &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;w_\varphi(P) = w_\varphi(u_0u_1) + w_\varphi(u_1u_2) + ... + w_\varphi(u_{k-1}u_k) = \varphi(u_0) + w(u_0u_1) - \varphi(u_1) + ... + \varphi(u_{k-1}) + w(u_{k-1}u_k) - \varphi(u_k) = \varphi(u_0) + w(P) - \varphi(u_k)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;w(P) &amp;lt; w(Q)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;w_\varphi(P) = \varphi(a) + w(P) - \varphi(b)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;w_\varphi(Q) = \varphi(a) + w(Q) - \varphi(b)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Отсюда, &amp;lt;tex&amp;gt;w_\varphi(P) &amp;lt; w_\varphi(Q)&amp;lt;/tex&amp;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;G&amp;lt;/tex&amp;gt; нет отрицательных циклов &amp;lt;tex&amp;gt;\Leftrightarrow&amp;lt;/tex&amp;gt; существует потенциальная функция &amp;lt;tex&amp;gt; \phi:\; \forall uv \in E\; w_\varphi(uv) \ge 0 &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;\Leftarrow &amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; - цикл в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;w(C) = w_\varphi(C) - \sum\limits_{uv \in C}  (\varphi(u) - \varphi(v))= w_\varphi(C) \ge 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\Rightarrow &amp;lt;/tex&amp;gt;: Добавим вершину &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в граф, соединим её со всеми вершинами графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; ребрами весом &amp;lt;tex&amp;gt;w = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:''Обозначение'' : &amp;lt;tex&amp;gt;\delta(i,\;j)&amp;lt;/tex&amp;gt; - минимальное расстояние между вершинами &amp;lt;tex&amp;gt;i,\; j&amp;lt;/tex&amp;gt; графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\phi(u) = \delta(s,\;u)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;w_\phi(uv) = \phi(u) + w(uv) - \phi(v) = \delta(s,\;u) + w(uv) - \delta(s,\;v)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\delta(s,\;u) + w(uv) = &amp;lt;/tex&amp;gt; {какой-то путь &amp;lt;tex&amp;gt;s \rightsquigarrow v&amp;lt;/tex&amp;gt;}.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\delta(s,\;v) =&amp;lt;/tex&amp;gt; {минимальный путь &amp;lt;tex&amp;gt;s \rightsquigarrow v&amp;lt;/tex&amp;gt;}.&lt;br /&gt;
&lt;br /&gt;
:Следовательно, &amp;lt;tex&amp;gt;w_\phi(uv) \ge 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;G' = (V',\;E')&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V' = V \cup \{s\}&amp;lt;/tex&amp;gt;, &lt;br /&gt;
 для некоторой новой вершины &amp;lt;tex&amp;gt;s \not\in V&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;E' = E \cup \{(s,\;v): \omega(s, v) = 0,\ v \in V \}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 '''if''' Bellman_Ford&amp;lt;tex&amp;gt;(G',\;\omega,\;s)&amp;lt;/tex&amp;gt; == FALSE&lt;br /&gt;
    '''then''' out &amp;lt;&amp;lt; «Входной граф содержит цикл с отрицательным весом»&lt;br /&gt;
    '''else''' '''for''' для каждой &amp;lt;tex&amp;gt;v \in V'&amp;lt;/tex&amp;gt;&lt;br /&gt;
         '''do''' присвоить величине &amp;lt;tex&amp;gt;\varphi(v)&amp;lt;/tex&amp;gt; значение &amp;lt;tex&amp;gt;\delta(s,\;v)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
            вычисленное алгоритмом Беллмана — Форда&lt;br /&gt;
         '''for''' для каждого ребра &amp;lt;tex&amp;gt;(u,\;v) \in E'&amp;lt;/tex&amp;gt;&lt;br /&gt;
             '''do''' &amp;lt;tex&amp;gt;w_\varphi(u,\;v) \leftarrow w(u,\;v) + \varphi(u) - \varphi(v)&amp;lt;/tex&amp;gt;&lt;br /&gt;
         '''for''' для каждой вершины &amp;lt;tex&amp;gt;u \in V&amp;lt;/tex&amp;gt;&lt;br /&gt;
             '''do''' вычисление с помощью алгоритма Дейкстры&lt;br /&gt;
             &amp;lt;tex&amp;gt;(G,\;w_\varphi,\;u)&amp;lt;/tex&amp;gt; величин &amp;lt;tex&amp;gt;\delta_\varphi(u,\;v)&amp;lt;/tex&amp;gt;&lt;br /&gt;
             для всех вершин &amp;lt;tex&amp;gt;v \in V&amp;lt;/tex&amp;gt;&lt;br /&gt;
             '''for''' для каждой вершины &amp;lt;tex&amp;gt;v \in V&amp;lt;/tex&amp;gt;&lt;br /&gt;
                 '''do''' &amp;lt;tex&amp;gt;d_{uv} \leftarrow \delta_\varphi(u,\;v) + \varphi(v) - \varphi(u)&amp;lt;/tex&amp;gt;&lt;br /&gt;
    '''return''' d&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;O(VE + VD)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;O(D)&amp;lt;/tex&amp;gt; - время работы [[Алгоритм Дейкстры| алгоритма Дейкстры]]. Если в алгоритме Дейкстры неубывающая очередь с приоритетами реализована в виде [http://ru.wikipedia.org/wiki/%D0%A4%D0%B8%D0%B1%D0%BE%D0%BD%D0%B0%D1%87%D1%87%D0%B8%D0%B5%D0%B2%D0%B0_%D0%BA%D1%83%D1%87%D0%B0 фибоначчиевой кучи], то время работы алгоритма Джонсона равно &amp;lt;tex&amp;gt;O(V^2\log V + V E)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Алгоритм Дейкстры]]&lt;br /&gt;
* [[Алгоритм Форда-Беллмана]]&lt;br /&gt;
* [[Алгоритм Флойда]]&lt;br /&gt;
* [http://rain.ifmo.ru/cat/view.php/vis/graph-paths/johnson-2001 Визуализатор алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* ''Кормен Т., Лейзерсон Ч., Ривест Р.'' Алгоритмы: построение и анализ.[http://wmate.ru/ebooks/?dl=380&amp;amp;mirror=1] — 2-е изд. — М.: Издательский дом «Вильямс», 2007. — С. 1296.&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Кратчайшие пути в графах ]]&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</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%94%D0%B6%D0%BE%D0%BD%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=12668</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%94%D0%B6%D0%BE%D0%BD%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=12668"/>
				<updated>2011-11-03T17:36:11Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: /* Описание */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Алгоритм Джонсона''' находит кратчайшие пути между всеми парами вершин взвешенного ориентированного графа с положительными или отрицательными ребрами, но не имеющем отрицательных циклов.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
&lt;br /&gt;
=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Джонсона позволяет найти кратчайшие пути между всеми парами вершин в течение времени &amp;lt;tex&amp;gt; O(V^2 * \log(V) + VE) &amp;lt;/tex&amp;gt;. Для разреженных графов этот алгоритм ведет себя асимптотически быстрее алгоритма Флойда. Этот алгоритм либо возвращает матрицу кратчайших расстояний между всеми парами вершин, либо сообщение о том, что в графе существует цикл отрицательной длины.&lt;br /&gt;
&lt;br /&gt;
В этом алгоритме используется метод '''изменения веса''' (англ. reweighting). Суть его заключается в том, что для заданного графа &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; строится новая весовая функция &amp;lt;tex&amp;gt; \hat{\omega} &amp;lt;/tex&amp;gt;, неотрицательная для всех ребер графа &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; и сохраняющая кратчайшие пути. Такая весовая функция строится при помощи так называемой '''потенциальной''' функции.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; \varphi : V \rightarrow \mathbb R &amp;lt;/tex&amp;gt; - произвольное отображение из множества вершин в вещественные числа. Тогда новой весовой функцией будет &amp;lt;tex&amp;gt; \omega_\varphi(u, v) = \omega(u, v) + \varphi(u) - \varphi(v) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}} &lt;br /&gt;
&lt;br /&gt;
Такая потенциальная функция строится при помощи добавлении фиктивной вершины в &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; и запуском алгоритма Форда-Беллмана из нее. На этом же этапе мы сможем обнаружить наличие отрицательного цикла в графе.&lt;br /&gt;
&lt;br /&gt;
Теперь, когда мы знаем, что веса всех ребер неотрицательны, и кратчайшие пути сохранятся, можно запустить алгоритм Дейкстры из каждой вершины и таким образом найти кратчайшие расстояния между всеми парами вершин.&lt;br /&gt;
&lt;br /&gt;
=== Сохранение кратчайших путей ===&lt;br /&gt;
Утверждается, что если какой-то путь &amp;lt;tex&amp;gt; P &amp;lt;/tex&amp;gt; был кратчайшим относительно весовой функции &amp;lt;tex&amp;gt; \omega &amp;lt;/tex&amp;gt;, то он будет кратчайшим и относительно новой весовой функции &amp;lt;tex&amp;gt; \hat{\omega} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;P,\; Q : a \rightsquigarrow b\;&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;w(P) &amp;lt; w(Q).&amp;lt;/tex&amp;gt; Тогда &amp;lt;tex&amp;gt;\forall \varphi: \; w_\varphi(P) &amp;lt; w_\varphi(Q)&amp;lt;/tex&amp;gt; &lt;br /&gt;
|proof=&lt;br /&gt;
:&amp;lt;tex&amp;gt;P: \;u_0 \rightarrow u_1 \rightarrow u_2 \rightarrow ... \rightarrow u_k &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;w_\varphi(P) = w_\varphi(u_0u_1) + w_\varphi(u_1u_2) + ... + w_\varphi(u_{k-1}u_k) = \varphi(u_0) + w(u_0u_1) - \varphi(u_1) + ... + \varphi(u_{k-1}) + w(u_{k-1}u_k) - \varphi(u_k) = \varphi(u_0) + w(P) - \varphi(u_k)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;w(P) &amp;lt; w(Q)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;w_\varphi(P) = \varphi(a) + w(P) - \varphi(b)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;w_\varphi(Q) = \varphi(a) + w(Q) - \varphi(b)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Отсюда, &amp;lt;tex&amp;gt;w_\varphi(P) &amp;lt; w_\varphi(Q)&amp;lt;/tex&amp;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;G&amp;lt;/tex&amp;gt; нет отрицательных циклов &amp;lt;tex&amp;gt;\Leftrightarrow&amp;lt;/tex&amp;gt; существует потенциальная функция &amp;lt;tex&amp;gt; \phi:\; \forall uv \in E\; w_\varphi(uv) \ge 0 &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;\Leftarrow &amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; - цикл в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;w(C) = w_\varphi(C) - \sum\limits_{uv \in C}  (\varphi(u) - \varphi(v))= w_\varphi(C) \ge 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\Rightarrow &amp;lt;/tex&amp;gt;: Добавим вершину &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в граф, соединим её со всеми вершинами графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; ребрами весом &amp;lt;tex&amp;gt;w = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:''Обозначение'' : &amp;lt;tex&amp;gt;\delta(i,\;j)&amp;lt;/tex&amp;gt; - минимальное расстояние между вершинами &amp;lt;tex&amp;gt;i,\; j&amp;lt;/tex&amp;gt; графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\phi(u) = \delta(s,\;u)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;w_\phi(uv) = \phi(u) + w(uv) - \phi(v) = \delta(s,\;u) + w(uv) - \delta(s,\;v)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\delta(s,\;u) + w(uv) = &amp;lt;/tex&amp;gt; {какой-то путь &amp;lt;tex&amp;gt;s \rightsquigarrow v&amp;lt;/tex&amp;gt;}.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\delta(s,\;v) =&amp;lt;/tex&amp;gt; {минимальный путь &amp;lt;tex&amp;gt;s \rightsquigarrow v&amp;lt;/tex&amp;gt;}.&lt;br /&gt;
&lt;br /&gt;
:Следовательно, &amp;lt;tex&amp;gt;w_\phi(uv) \ge 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;G' = (V',\;E')&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V' = V \cup \{s\}&amp;lt;/tex&amp;gt;, &lt;br /&gt;
 для некоторой новой вершины &amp;lt;tex&amp;gt;s \not\in V&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;E' = E \cup \{(s,\;v): v \in V\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 '''if''' Bellman_Ford&amp;lt;tex&amp;gt;(G',\;\omega,\;s)&amp;lt;/tex&amp;gt; == FALSE&lt;br /&gt;
    '''then''' out &amp;lt;&amp;lt; «Входной граф содержит цикл с отрицательным весом»&lt;br /&gt;
    '''else''' '''for''' для каждой &amp;lt;tex&amp;gt;v \in V'&amp;lt;/tex&amp;gt;&lt;br /&gt;
         '''do''' присвоить величине &amp;lt;tex&amp;gt;\varphi(v)&amp;lt;/tex&amp;gt; значение &amp;lt;tex&amp;gt;\delta(s,\;v)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
            вычисленное алгоритмом Беллмана — Форда&lt;br /&gt;
         '''for''' для каждого ребра &amp;lt;tex&amp;gt;(u,\;v) \in E'&amp;lt;/tex&amp;gt;&lt;br /&gt;
             '''do''' &amp;lt;tex&amp;gt;w_\varphi(u,\;v) \leftarrow w(u,\;v) + \varphi(u) - \varphi(v)&amp;lt;/tex&amp;gt;&lt;br /&gt;
         '''for''' для каждой вершины &amp;lt;tex&amp;gt;u \in V&amp;lt;/tex&amp;gt;&lt;br /&gt;
             '''do''' вычисление с помощью алгоритма Дейкстры&lt;br /&gt;
             &amp;lt;tex&amp;gt;(G,\;w_\varphi,\;u)&amp;lt;/tex&amp;gt; величин &amp;lt;tex&amp;gt;\delta_\varphi(u,\;v)&amp;lt;/tex&amp;gt;&lt;br /&gt;
             для всех вершин &amp;lt;tex&amp;gt;v \in V&amp;lt;/tex&amp;gt;&lt;br /&gt;
             '''for''' для каждой вершины &amp;lt;tex&amp;gt;v \in V&amp;lt;/tex&amp;gt;&lt;br /&gt;
                 '''do''' &amp;lt;tex&amp;gt;d_{uv} \leftarrow \delta_\varphi(u,\;v) + \varphi(v) - \varphi(u)&amp;lt;/tex&amp;gt;&lt;br /&gt;
    '''return''' D&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;O(VE + VD)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;O(D)&amp;lt;/tex&amp;gt; - время работы [[Алгоритм Дейкстры| алгоритма Дейкстры]]. Если в алгоритме Дейкстры неубывающая очередь с приоритетами реализована в виде [http://ru.wikipedia.org/wiki/%D0%A4%D0%B8%D0%B1%D0%BE%D0%BD%D0%B0%D1%87%D1%87%D0%B8%D0%B5%D0%B2%D0%B0_%D0%BA%D1%83%D1%87%D0%B0 фибоначчиевой кучи], то время работы алгоритма Джонсона равно &amp;lt;tex&amp;gt;O(V^2\log V + V E)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Алгоритм Дейкстры]]&lt;br /&gt;
* [[Алгоритм Форда-Беллмана]]&lt;br /&gt;
* [[Алгоритм Флойда]]&lt;br /&gt;
* [http://rain.ifmo.ru/cat/view.php/vis/graph-paths/johnson-2001 Визуализатор алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* ''Кормен Т., Лейзерсон Ч., Ривест Р.'' Алгоритмы: построение и анализ.[http://wmate.ru/ebooks/?dl=380&amp;amp;mirror=1] — 2-е изд. — М.: Издательский дом «Вильямс», 2007. — С. 1296.&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Кратчайшие пути в графах ]]&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</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%94%D0%B6%D0%BE%D0%BD%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=12667</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%94%D0%B6%D0%BE%D0%BD%D1%81%D0%BE%D0%BD%D0%B0&amp;diff=12667"/>
				<updated>2011-11-03T17:32:01Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: /* Теорема о существовании потенциальной функции */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Алгоритм Джонсона''' находит кратчайшие пути между всеми парами вершин взвешенного ориентированного графа с положительными или отрицательными ребрами, но не имеющем отрицательных циклов.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
&lt;br /&gt;
=== Описание ===&lt;br /&gt;
&lt;br /&gt;
Алгоритм Джонсона позволяет найти кратчайшие пути между всеми парами вершин в течение времени &amp;lt;tex&amp;gt; O(V^2 * \log(V) + VE) &amp;lt;/tex&amp;gt;. Для разреженных графов этот алгоритм ведет себя асиптотически быстрее алгоритма Флойда. Этот алгоритм либо возвращает матрицу кратчайших расстояний между всеми парами вершин, либо сообщение о том, что в графе существует цикл отрицательной длины.&lt;br /&gt;
&lt;br /&gt;
В этом алгоритме используется метод '''изменения веса''' (англ. reweighting). Суть его заключается в том, что для заданного графа &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; строится новая весовая функция &amp;lt;tex&amp;gt; \hat{\omega} &amp;lt;/tex&amp;gt;, неотрицательная для всех ребер графа &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; и сохраняющая кратчайшие пути. Такая весовая функция строится при помощи так называемой '''потенциальной''' функции.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; \varphi : V \rightarrow \mathbb R &amp;lt;/tex&amp;gt; - произвольное отображение из множества вершин в вещественные числа. Тогда новой весовой функцией будет &amp;lt;tex&amp;gt; \hat{\omega}(u, v) = \omega(u, v) + \varphi(u) - \varphi(v) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}} &lt;br /&gt;
&lt;br /&gt;
Такая потенциальная функция строится при помощи добавлении фиктивной вершины в &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; и запуском алгоритма Форда-Беллмана из нее. На этом же этапе мы сможем обнаружить наличие отрицательного цикла в графе.&lt;br /&gt;
&lt;br /&gt;
Теперь, когда мы знаем, что веса всех ребер неотрицательны, и кратчайшие пути сохранятся, можно запустить алгоритм Дейкстры из каждой вершины и таким образом найти кратчайшие расстояния между всеми парами вершин.&lt;br /&gt;
&lt;br /&gt;
=== Сохранение кратчайших путей ===&lt;br /&gt;
Утверждается, что если какой-то путь &amp;lt;tex&amp;gt; P &amp;lt;/tex&amp;gt; был кратчайшим относительно весовой функции &amp;lt;tex&amp;gt; \omega &amp;lt;/tex&amp;gt;, то он будет кратчайшим и относительно новой весовой функции &amp;lt;tex&amp;gt; \hat{\omega} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;P,\; Q : a \rightsquigarrow b\;&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;w(P) &amp;lt; w(Q).&amp;lt;/tex&amp;gt; Тогда &amp;lt;tex&amp;gt;\forall \varphi: \; w_\varphi(P) &amp;lt; w_\varphi(Q)&amp;lt;/tex&amp;gt; &lt;br /&gt;
|proof=&lt;br /&gt;
:&amp;lt;tex&amp;gt;P: \;u_0 \rightarrow u_1 \rightarrow u_2 \rightarrow ... \rightarrow u_k &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;w_\varphi(P) = w_\varphi(u_0u_1) + w_\varphi(u_1u_2) + ... + w_\varphi(u_{k-1}u_k) = \varphi(u_0) + w(u_0u_1) - \varphi(u_1) + ... + \varphi(u_{k-1}) + w(u_{k-1}u_k) - \varphi(u_k) = \varphi(u_0) + w(P) - \varphi(u_k)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;w(P) &amp;lt; w(Q)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;w_\varphi(P) = \varphi(a) + w(P) - \varphi(b)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;w_\varphi(Q) = \varphi(a) + w(Q) - \varphi(b)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:Отсюда, &amp;lt;tex&amp;gt;w_\varphi(P) &amp;lt; w_\varphi(Q)&amp;lt;/tex&amp;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;G&amp;lt;/tex&amp;gt; нет отрицательных циклов &amp;lt;tex&amp;gt;\Leftrightarrow&amp;lt;/tex&amp;gt; существует потенциальная функция &amp;lt;tex&amp;gt; \phi:\; \forall uv \in E\; w_\varphi(uv) \ge 0 &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;\Leftarrow &amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; - цикл в графе &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;w(C) = w_\varphi(C) - \sum\limits_{uv \in C}  (\varphi(u) - \varphi(v))= w_\varphi(C) \ge 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\Rightarrow &amp;lt;/tex&amp;gt;: Добавим вершину &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в граф, соединим её со всеми вершинами графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; ребрами весом &amp;lt;tex&amp;gt;w = 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:''Обозначение'' : &amp;lt;tex&amp;gt;\delta(i,\;j)&amp;lt;/tex&amp;gt; - минимальное расстояние между вершинами &amp;lt;tex&amp;gt;i,\; j&amp;lt;/tex&amp;gt; графа &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\phi(u) = \delta(s,\;u)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;w_\phi(uv) = \phi(u) + w(uv) - \phi(v) = \delta(s,\;u) + w(uv) - \delta(s,\;v)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\delta(s,\;u) + w(uv) = &amp;lt;/tex&amp;gt; {какой-то путь &amp;lt;tex&amp;gt;s \rightsquigarrow v&amp;lt;/tex&amp;gt;}.&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;tex&amp;gt;\delta(s,\;v) =&amp;lt;/tex&amp;gt; {минимальный путь &amp;lt;tex&amp;gt;s \rightsquigarrow v&amp;lt;/tex&amp;gt;}.&lt;br /&gt;
&lt;br /&gt;
:Следовательно, &amp;lt;tex&amp;gt;w_\phi(uv) \ge 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;G' = (V',\;E')&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V' = V \cup \{s\}&amp;lt;/tex&amp;gt;, &lt;br /&gt;
 для некоторой новой вершины &amp;lt;tex&amp;gt;s \not\in V&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;E' = E \cup \{(s,\;v): v \in V\}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 '''if''' Bellman_Ford&amp;lt;tex&amp;gt;(G',\;\omega,\;s)&amp;lt;/tex&amp;gt; == FALSE&lt;br /&gt;
    '''then''' out &amp;lt;&amp;lt; «Входной граф содержит цикл с отрицательным весом»&lt;br /&gt;
    '''else''' '''for''' для каждой &amp;lt;tex&amp;gt;v \in V'&amp;lt;/tex&amp;gt;&lt;br /&gt;
         '''do''' присвоить величине &amp;lt;tex&amp;gt;\varphi(v)&amp;lt;/tex&amp;gt; значение &amp;lt;tex&amp;gt;\delta(s,\;v)&amp;lt;/tex&amp;gt;,&lt;br /&gt;
            вычисленное алгоритмом Беллмана — Форда&lt;br /&gt;
         '''for''' для каждого ребра &amp;lt;tex&amp;gt;(u,\;v) \in E'&amp;lt;/tex&amp;gt;&lt;br /&gt;
             '''do''' &amp;lt;tex&amp;gt;w_\varphi(u,\;v) \leftarrow w(u,\;v) + \varphi(u) - \varphi(v)&amp;lt;/tex&amp;gt;&lt;br /&gt;
         '''for''' для каждой вершины &amp;lt;tex&amp;gt;u \in V&amp;lt;/tex&amp;gt;&lt;br /&gt;
             '''do''' вычисление с помощью алгоритма Дейкстры&lt;br /&gt;
             &amp;lt;tex&amp;gt;(G,\;w_\varphi,\;u)&amp;lt;/tex&amp;gt; величин &amp;lt;tex&amp;gt;\delta_\varphi(u,\;v)&amp;lt;/tex&amp;gt;&lt;br /&gt;
             для всех вершин &amp;lt;tex&amp;gt;v \in V&amp;lt;/tex&amp;gt;&lt;br /&gt;
             '''for''' для каждой вершины &amp;lt;tex&amp;gt;v \in V&amp;lt;/tex&amp;gt;&lt;br /&gt;
                 '''do''' &amp;lt;tex&amp;gt;d_{uv} \leftarrow \delta_\varphi(u,\;v) + \varphi(v) - \varphi(u)&amp;lt;/tex&amp;gt;&lt;br /&gt;
    '''return''' D&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;O(VE + VD)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;O(D)&amp;lt;/tex&amp;gt; - время работы [[Алгоритм Дейкстры| алгоритма Дейкстры]]. Если в алгоритме Дейкстры неубывающая очередь с приоритетами реализована в виде [http://ru.wikipedia.org/wiki/%D0%A4%D0%B8%D0%B1%D0%BE%D0%BD%D0%B0%D1%87%D1%87%D0%B8%D0%B5%D0%B2%D0%B0_%D0%BA%D1%83%D1%87%D0%B0 фибоначчиевой кучи], то время работы алгоритма Джонсона равно &amp;lt;tex&amp;gt;O(V^2\log V + V E)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
* [[Алгоритм Дейкстры]]&lt;br /&gt;
* [[Алгоритм Форда-Беллмана]]&lt;br /&gt;
* [[Алгоритм Флойда]]&lt;br /&gt;
* [http://rain.ifmo.ru/cat/view.php/vis/graph-paths/johnson-2001 Визуализатор алгоритма]&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&gt;
* ''Кормен Т., Лейзерсон Ч., Ривест Р.'' Алгоритмы: построение и анализ.[http://wmate.ru/ebooks/?dl=380&amp;amp;mirror=1] — 2-е изд. — М.: Издательский дом «Вильямс», 2007. — С. 1296.&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Кратчайшие пути в графах ]]&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</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%A4%D0%BB%D0%BE%D0%B9%D0%B4%D0%B0&amp;diff=12665</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%BB%D0%BE%D0%B9%D0%B4%D0%B0&amp;diff=12665"/>
				<updated>2011-11-03T17:02:15Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: /* Код (окончательный) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Алгоритм Флойда (алгоритм Флойда–Уоршелла)''' {{---}} алгоритм нахождения длин кратчайших путей между всеми парами вершин во взвешенном ориентированном графе. Работает корректно, если в графе нет циклов отрицательной величины, а в случае, когда такой цикл есть, позволяет найти хотя бы один такой цикл. Этот алгоритм работает в течение времени &amp;lt;tex&amp;gt; \Theta(n^3) &amp;lt;/tex&amp;gt; и использует &amp;lt;tex&amp;gt; \Theta(n^2) &amp;lt;/tex&amp;gt; памяти. Разработан в 1962 году.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
[[Файл:Floyd.png|right|thumb|Текущий (синий) путь и потенциально более короткий (красный)]]&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;\omega_{uv} =&lt;br /&gt;
\begin{cases}&lt;br /&gt;
\text{weight of }uv ,&amp;amp; \text{if } uv \in E \\&lt;br /&gt;
+\infty ,&amp;amp; \text{if } uv \notin E&lt;br /&gt;
\end{cases}&amp;lt;/tex&amp;gt;, в котором вершины пронумерованы от &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;. Требуется найти матрицу кратчайших расстояний &amp;lt;tex&amp;gt; d &amp;lt;/tex&amp;gt;, в которой элемент &amp;lt;tex&amp;gt; d_{ij} &amp;lt;/tex&amp;gt; либо равен длине кратчайшего пути из &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt;, либо равен &amp;lt;tex&amp;gt; +\infty &amp;lt;/tex&amp;gt;, если вершина &amp;lt;tex&amp;gt; j &amp;lt;/tex&amp;gt; не достижима из &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&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;u&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, только вершины из множества &amp;lt;tex&amp;gt; \{ 1 .. i \} &amp;lt;/tex&amp;gt; как &amp;lt;tex&amp;gt;d_{uv}^{(i)}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;d_{uv}^{(0)} = \omega_{uv}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
На каждом шаге алгоритма, мы будем брать очередную вершину (пусть её номер {{---}} &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;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; d_{uv}^{(i)} = min(d_{uv}^{(i-1)}, d_{ui}^{(i-1)} + d_{iv}^{(i-1)}) &amp;lt;/tex&amp;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; \{ 1 .. i \} &amp;lt;/tex&amp;gt;, проходит через вершину &amp;lt;tex&amp;gt;i&amp;lt;/tex&amp;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; u &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;, объединенный с кратчайшим путем из &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;. В противном случае, когда этот путь не содержит вершины &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;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; \{ 1 .. i \} &amp;lt;/tex&amp;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; \{ 1 .. i-1 \} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Код (в первом приближении) ===&lt;br /&gt;
  # Инициализация&lt;br /&gt;
  &amp;lt;tex dpi = &amp;quot;105&amp;quot;&amp;gt; d^{(0)} = w &amp;lt;/tex&amp;gt;&lt;br /&gt;
  # Основная часть&lt;br /&gt;
  for i in {1..n}:&lt;br /&gt;
    for u in {1..n}:&lt;br /&gt;
      for v in {1..n}:&lt;br /&gt;
        &amp;lt;tex dpi = &amp;quot;105&amp;quot; &amp;gt; d^{(i)}_{uv} = min(d^{(i - 1)}_{uv}, d^{(i - 1)}_{ui} + d^{(i - 1)}_{iv}) &amp;lt;/tex&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
В итоге получаем, что матрица &amp;lt;tex&amp;gt; d^{(n)} &amp;lt;/tex&amp;gt; и является искомой матрицей кратчайших путей, поскольку содержит в себе длины кратчайших путей между всеми парами вершин, имеющих в качестве промежуточных вершин вершины из множества &amp;lt;tex&amp;gt; \{ 1..n \} &amp;lt;/tex&amp;gt;, что есть попросту все вершины графа. Такая реализация работает за &amp;lt;tex&amp;gt; \Theta(n^3) &amp;lt;/tex&amp;gt; времени и использует &amp;lt;tex&amp;gt; \Theta(n^3) &amp;lt;/tex&amp;gt; памяти.&lt;br /&gt;
&lt;br /&gt;
=== Код (окончательный) ===&lt;br /&gt;
Утверждается, что можно избавиться от одной размерности в массиве &amp;lt;tex&amp;gt; d &amp;lt;/tex&amp;gt;, т.е. использовать двумерный массив &amp;lt;tex&amp;gt;d_{uv}&amp;lt;/tex&amp;gt;. В процессе работы алгоритма поддерживается инвариант &amp;lt;tex&amp;gt;\rho(u, v) \le d_{uv} \le d_{uv}^{(i)}&amp;lt;/tex&amp;gt;, а, поскольку, после выполнения работы алгоритма &amp;lt;tex&amp;gt; \rho(u, v) == d_{uv}^{(i)} &amp;lt;/tex&amp;gt;, то тогда будет выполняться и &amp;lt;tex&amp;gt; \rho(u, v) == d_{uv} &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
В течение работы алгоритма Флойда выполняются неравенства: &amp;lt;tex&amp;gt;\rho(u, v) \le d_{uv} \le d_{uv}^{(i)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
&lt;br /&gt;
После инициализации все неравенства, очевидно, выполняются. Далее, массив &amp;lt;tex&amp;gt; d &amp;lt;/tex&amp;gt; может измениться только в строчке 5. Докажем оба неравенства по индукции по итерациям алгоритма:&lt;br /&gt;
&lt;br /&gt;
# &amp;lt;tex&amp;gt; \rho(u, v) \le d_{uv} &amp;lt;/tex&amp;gt;. Рассмотрим два случая:&lt;br /&gt;
#* Значение &amp;lt;tex&amp;gt; d_{uv} &amp;lt;/tex&amp;gt; изменилось. Тогда &amp;lt;tex&amp;gt; d_{uv} = d_{ui} + d_{iv} \ge \rho(u, i) + \rho(i, v) \ge \rho(u, v) &amp;lt;/tex&amp;gt; (по индукционному предположению и неравенству треугольника для &amp;lt;tex&amp;gt; \rho &amp;lt;/tex&amp;gt;).&lt;br /&gt;
#* Значение &amp;lt;tex&amp;gt; d_{uv} &amp;lt;/tex&amp;gt; не изменилось. Тогда неравенство выполняется автоматически по индукционному предположению.&lt;br /&gt;
# &amp;lt;tex&amp;gt; d_{uv} \le d_{uv}^{(i)} &amp;lt;/tex&amp;gt;. Аналогично рассмотрим два случая:&lt;br /&gt;
#* Значение &amp;lt;tex&amp;gt; d_{uv}^{(i)} &amp;lt;/tex&amp;gt; изменилось. Тогда &amp;lt;tex&amp;gt; d_{uv}^{(i)} \ge d_{ui}^{(i-1)} + d_{iv}^{(i-1)} \ge d_{ui}^{(i)} + d_{iv}^{(i)} \ge d_{ui} + d_{uv} \ge d_{uv} &amp;lt;/tex&amp;gt;, по индукционному предположению и тому факту, что &amp;lt;tex&amp;gt; d_{uv}^{(i)} &amp;lt;/tex&amp;gt; не возрастает с ростом &amp;lt;tex&amp;gt; i &amp;lt;/tex&amp;gt;.&lt;br /&gt;
#* В ином случае всё очевидно: &amp;lt;tex&amp;gt; d_{uv}^{(i)} = d_{uv}^{(i - 1)} \ge d_{uv} &amp;lt;/tex&amp;gt;, и неравенство тривиально.&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
  # Инициализация&lt;br /&gt;
  &amp;lt;tex dpi = &amp;quot;105&amp;quot;&amp;gt; d = w &amp;lt;/tex&amp;gt; &lt;br /&gt;
  # Основная часть&lt;br /&gt;
  for i in {1..n}:&lt;br /&gt;
    for u in {1..n}:&lt;br /&gt;
      for v in {1..n}:&lt;br /&gt;
        &amp;lt;tex dpi = &amp;quot;105&amp;quot;&amp;gt; d_{uv} = min(d_{uv}, d_{ui} + d_{iv}) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Данная реализация работает за время &amp;lt;tex&amp;gt; \Theta(n^3) &amp;lt;/tex&amp;gt;, но требует уже &amp;lt;tex&amp;gt; \Theta(n^2) &amp;lt;/tex&amp;gt; памяти. В целом, алгоритм Флойда очень прост, и, поскольку в нем используются только простые операции, константа, скрытая в определении &amp;lt;tex&amp;gt; \Theta &amp;lt;/tex&amp;gt; весьма мала.&lt;br /&gt;
&lt;br /&gt;
=== Пример работы ===&lt;br /&gt;
{|style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
| &amp;lt;tex&amp;gt;i = 0&amp;lt;/tex&amp;gt; ||  &amp;lt;tex&amp;gt;i = 1&amp;lt;/tex&amp;gt; ||  &amp;lt;tex&amp;gt;i = 2&amp;lt;/tex&amp;gt; ||  &amp;lt;tex&amp;gt;i = 3 &amp;lt;/tex&amp;gt; || &amp;lt;tex&amp;gt;i = 4&amp;lt;/tex&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| [[Файл:Floyd_step0.png]] || [[Файл:Floyd_step1.png]] || [[Файл:Floyd_step2.png]] || [[Файл:Floyd_step3.png]] || [[Файл:Floyd_step4.png]]&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;tex&amp;gt;\begin{pmatrix}&lt;br /&gt;
\times &amp;amp; 1 &amp;amp; 6 &amp;amp; \infty \\&lt;br /&gt;
\infty &amp;amp; \times &amp;amp; 4 &amp;amp; 1 \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; \times &amp;amp; \infty \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; 1 &amp;amp; \times \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 || &amp;lt;tex&amp;gt;\begin{pmatrix}&lt;br /&gt;
\times &amp;amp; 1 &amp;amp; 6 &amp;amp; \infty \\&lt;br /&gt;
\infty &amp;amp; \times &amp;amp; 4 &amp;amp; 1 \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; \times &amp;amp; \infty \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; 1 &amp;amp; \times \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 || &amp;lt;tex&amp;gt;\begin{pmatrix}&lt;br /&gt;
\times &amp;amp; 1 &amp;amp; \bf{5} &amp;amp; \bf{2} \\&lt;br /&gt;
\infty &amp;amp; \times &amp;amp; 4 &amp;amp; 1 \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; \times &amp;amp; \infty \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; 1 &amp;amp; \times \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 || &amp;lt;tex&amp;gt;\begin{pmatrix}&lt;br /&gt;
\times &amp;amp; 1 &amp;amp; 5 &amp;amp; 2 \\&lt;br /&gt;
\infty &amp;amp; \times &amp;amp; 4 &amp;amp; 1 \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; \times &amp;amp; \infty \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; 1 &amp;amp; \times \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/tex&amp;gt;&lt;br /&gt;
 || &amp;lt;tex&amp;gt;\begin{pmatrix}&lt;br /&gt;
\times &amp;amp; 1 &amp;amp; \bf{3} &amp;amp; 2 \\&lt;br /&gt;
\infty &amp;amp; \times &amp;amp; \bf{2} &amp;amp; 1 \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; \times &amp;amp; \infty \\&lt;br /&gt;
\infty &amp;amp; \infty &amp;amp; 1 &amp;amp; \times \\&lt;br /&gt;
\end{pmatrix}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Вывод кратчайшего пути ==&lt;br /&gt;
Алгоритм Флойда легко модифицировать таким образом, чтобы он возвращал не только длину кратчайшего пути, но и сам путь. Для этого достаточно завести дополнительный массив &amp;lt;tex&amp;gt;next_{uv}&amp;lt;/tex&amp;gt;, в котором будет храниться номер вершины, в которую надо пойти следующей, чтобы дойти из &amp;lt;tex&amp;gt;u&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;
  # Инициализация&lt;br /&gt;
  d = w&lt;br /&gt;
  t[u][v] = v если есть ребро uv&lt;br /&gt;
  # Основная часть&lt;br /&gt;
  for i in {1..n}:&lt;br /&gt;
    for u in {1..n}:&lt;br /&gt;
      for v in {1..n}:&lt;br /&gt;
        if (d[u][i] + d[i][v]) &amp;lt; d[u][v]: &lt;br /&gt;
          d[u][v] = d[u][i] + d[i][v]&lt;br /&gt;
          next[u][v] = next[u][i]&lt;br /&gt;
&lt;br /&gt;
  # Вывод кратчайшего пути&lt;br /&gt;
  def get_shortest_path(u, v):&lt;br /&gt;
    if d[u][v] == inf:&lt;br /&gt;
        raise NoPath # Из u в v пути нет&lt;br /&gt;
    c = u&lt;br /&gt;
    while c != v:&lt;br /&gt;
      print c&lt;br /&gt;
      c = next[c][v]&lt;br /&gt;
    print v&lt;br /&gt;
&lt;br /&gt;
[[Файл:Floyd_path.png]]&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>Chuprikov Pavel</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%A4%D0%BE%D1%80%D0%B4%D0%B0-%D0%91%D0%B5%D0%BB%D0%BB%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=12557</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%91%D0%B5%D0%BB%D0%BB%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=12557"/>
				<updated>2011-11-01T06:47:00Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: /* Корректность алгоритма Форда-Беллмана */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Алгоритм==&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;br&amp;gt;&lt;br /&gt;
:В случае когда в графе &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; содержатся отрицательные циклы достижимые из &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; алгоритм сообщает, что кратчайших путей не существует.&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
&lt;br /&gt;
 '''Bellman_Ford(G, s)'''&lt;br /&gt;
   '''for''' для каждой &amp;lt;tex&amp;gt;v \in V[G]&amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt; d[v] \leftarrow \mathcal {1} &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;d[s] \leftarrow 0 &amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''for''' &amp;lt;tex&amp;gt; i \leftarrow 1 &amp;lt;/tex&amp;gt; '''to''' &amp;lt;tex&amp;gt; \mid V[G] \mid - 1 &amp;lt;/tex&amp;gt;&lt;br /&gt;
      '''for''' для каждого ребра &amp;lt;tex&amp;gt; (u, v) \in E[G] &amp;lt;/tex&amp;gt;&lt;br /&gt;
            '''if''' &amp;lt;tex&amp;gt;d[v] &amp;gt; d[u] + \omega(u, v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
                  '''then''' &amp;lt;tex&amp;gt;d[v] \leftarrow d[u] + \omega(u, v)&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''for''' для каждого ребра &amp;lt;tex&amp;gt; (u, v) \in E[G] &amp;lt;/tex&amp;gt;&lt;br /&gt;
      '''if''' &amp;lt;tex&amp;gt;d[v] &amp;gt; d[u] + \omega(u, v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
            '''then''' '''return''' &amp;lt;tex&amp;gt; \mathit false&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''return''' &amp;lt;tex&amp;gt; \mathit true &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Корректность алгоритма Форда-Беллмана==&lt;br /&gt;
:В этом алгоритме используется релаксация, в результате которой &amp;lt;tex&amp;gt;d[v]&amp;lt;/tex&amp;gt; уменьшается до тех пор, пока не станет равным &amp;lt;tex&amp;gt;\delta(s, v)&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;tex&amp;gt;d[v]&amp;lt;/tex&amp;gt; - оценка веса кратчайшего пути из вершины &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в каждую вершину &amp;lt;tex&amp;gt;v \in V&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;tex&amp;gt;\delta(s, 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;.&lt;br /&gt;
&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;br&amp;gt;Тогда после завершения &amp;lt;tex&amp;gt; \mid V[G] \mid - 1 &amp;lt;/tex&amp;gt; итераций цикла для всех вершин, достижимых из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, выполняется равенство &amp;lt;tex&amp;gt; d[v] = \delta (s, v) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=:Рассмотрим произвольную вершину &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, достижимую из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Пусть &amp;lt;tex&amp;gt;p = \langle v_0,..., v_{k} \rangle &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;v_0 = s&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;v_{k} = 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;br&amp;gt;&lt;br /&gt;
:Путь &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt; содержит не более &amp;lt;tex&amp;gt; \mid V[G] \mid - 1 &amp;lt;/tex&amp;gt; ребер. Поэтому &amp;lt;tex&amp;gt;k \le \mid V[G] \mid - 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: Докажем следующее утверждение: &lt;br /&gt;
:: После &amp;lt;tex&amp;gt;n : (n \le k)&amp;lt;/tex&amp;gt; итераций первого цикла алгоритма, &amp;lt;tex&amp;gt;d[v_n] = \delta(s, v_n) &amp;lt;/tex&amp;gt;&lt;br /&gt;
: Воспользуемся индукцией по &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;:&lt;br /&gt;
: '''База индукции.''' Перед первой итерацией утверждение очевидно выполнено: &amp;lt;tex&amp;gt;d[v_0] = d[s] = \delta(s, s) = 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
: '''Индукционный переход.''' Пусть после &amp;lt;tex&amp;gt;n : (n &amp;lt; k)&amp;lt;/tex&amp;gt; итераций, верно что &amp;lt;tex&amp;gt;d[v_n] = \delta(s, v_n)&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;(v_n, v_{n + 1})&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;\delta(s, v_{n+1}) = \delta(s, v_n) + \omega(v_n, v_{n + 1})&amp;lt;/tex&amp;gt;. Во время &amp;lt;tex&amp;gt;l + 1&amp;lt;/tex&amp;gt; итерации релаксируется ребро &amp;lt;tex&amp;gt;(v_n,v_{n+1})&amp;lt;/tex&amp;gt;, следовательно по завершению итерации будет выполнено&lt;br /&gt;
::&amp;lt;tex&amp;gt;d[v_{n+1}] \le d[v_n] + \omega(v_n, v_{n+1}) = \delta(s, v_n) + \omega(v_n, v_{n+1}) = \delta(s, v_{n+1})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
: Ясно, что &amp;lt;tex&amp;gt;d[v_{n+1}] \ge \delta(s, v_{n+1}) &amp;lt;/tex&amp;gt;, поэтому верно что после &amp;lt;tex&amp;gt;l + 1&amp;lt;/tex&amp;gt; итерации &amp;lt;tex&amp;gt;d[v_{n+1}] = \delta(s, v_{n + 1})&amp;lt;/tex&amp;gt;. &lt;br /&gt;
: Индукционный переход доказан.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: Итак, выполнены равенства &amp;lt;tex&amp;gt;d[v] = d[v_{k}] = \delta (s, v_{k}) = \delta (s, v)&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&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;br&amp;gt;Если граф &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; не содержит отрицательных циклов, достижимых из вершины &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;, то алгоритм возвращает &amp;lt;tex&amp;gt; true &amp;lt;/tex&amp;gt; и для всех &amp;lt;tex&amp;gt; v \in V[G] \  d[v] = \delta (s, v)&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;Если граф &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; содержит отрицательные циклы, достижимые из вершины &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;, то алгоритм возвращает &amp;lt;tex&amp;gt; false &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=:Пусть граф &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; не содержит отрицательных циклов, достижимых из вершины &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
:Тогда если вершина &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; достижима из &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;, то по лемме &amp;lt;tex&amp;gt; d[v] = \delta (s, v)&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
:Если вершина &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; не достижима из &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; d[v] = \delta (s, v) = \mathcal {1}&amp;lt;/tex&amp;gt; из несуществования пути. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Теперь докажем, что алгоритм вернет значение &amp;lt;tex&amp;gt; true &amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
:После выполнения алгоритма верно, что для всех &amp;lt;tex&amp;gt; (u, v) \in E[G], \  d[v] = \delta (s, v) \leqslant \delta (s, u) + \omega (u,v) = d[u] + \omega (u,v)&amp;lt;/tex&amp;gt;, значит ни одна из проверок не вернет значения &amp;lt;tex&amp;gt; false &amp;lt;/tex&amp;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; c = {v_0,...,v_{k}} &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; v_0 = v_{k} &amp;lt;/tex&amp;gt;, достижимый из вершины &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
:Тогда &amp;lt;tex&amp;gt;\sum\limits_{i=1}^{k} {\omega (v_{i-1}, v_{i})} &amp;lt; 0 &amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
:Предположим, что алгоритм возвращает &amp;lt;tex&amp;gt; true &amp;lt;/tex&amp;gt;, тогда для &amp;lt;tex&amp;gt; i = 1,...,k &amp;lt;/tex&amp;gt; выполняется &amp;lt;tex&amp;gt; d[v_{i}] \leqslant d[v_{i-1}] + \omega (v_{i-1}, v_{i}) &amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
:Просуммируем эти неравенства по всему циклу: &amp;lt;tex&amp;gt;\sum\limits_{i=1}^{k} {d[v_{i}]} \leqslant \sum\limits_{i=1}^{k} {d[v_{i-1}]} + \sum\limits_{i=1}^{k} {\omega (v_{i-1}, v_{i})} &amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
:Из того, что &amp;lt;tex&amp;gt; v_0 = v_{k} &amp;lt;/tex&amp;gt; следует, что &amp;lt;tex&amp;gt; \sum\limits^{k}_{i=1} {d[v_{i}]} = \sum \limits_{i=1}^{k} {d[v_{i - 1}]} &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Получили, что &amp;lt;tex&amp;gt; \sum \limits_{i=1}^{k} {\omega (v_{i-1}, v_{i})} \ge 0 &amp;lt;/tex&amp;gt;, что противоречит отрицательности цикла &amp;lt;tex&amp;gt; c &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Сложность==&lt;br /&gt;
:Инициализация занимает &amp;lt;tex&amp;gt; \Theta (V) &amp;lt;/tex&amp;gt; времени, каждый из &amp;lt;tex&amp;gt; \mid V[G] \mid - 1 &amp;lt;/tex&amp;gt; проходов требует &amp;lt;tex&amp;gt; \Theta (E) &amp;lt;/tex&amp;gt; времени, обход по всем ребрам для проверки наличия отрицательного цикла занимает &amp;lt;tex&amp;gt;O(E)&amp;lt;/tex&amp;gt; времени.&amp;lt;br&amp;gt;Итого алгоритм Беллмана-Форда работает за &amp;lt;tex&amp;gt;O(V E)&amp;lt;/tex&amp;gt; времени.&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
:Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Алгоритмы: построение и анализ / пер. с англ. — изд. 2-е — М.: Издательский дом «Вильямс», 2009. — с.672 — 676. — ISBN 978-5-8459-0857-5.&lt;br /&gt;
:[http://e-maxx.ru/algo/export_ford_bellman Алгоритм Форда-Беллмана]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Кратчайшие пути в графах]]&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</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%A4%D0%BE%D1%80%D0%B4%D0%B0-%D0%91%D0%B5%D0%BB%D0%BB%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=12548</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%91%D0%B5%D0%BB%D0%BB%D0%BC%D0%B0%D0%BD%D0%B0&amp;diff=12548"/>
				<updated>2011-11-01T04:35:09Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: /* Корректность алгоритма Форда-Беллмана */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Алгоритм==&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;br&amp;gt;&lt;br /&gt;
:В случае когда в графе &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; содержатся отрицательные циклы достижимые из &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; алгоритм сообщает, что кратчайших путей не существует.&lt;br /&gt;
&lt;br /&gt;
==Псевдокод==&lt;br /&gt;
&lt;br /&gt;
 '''Bellman_Ford(G, s)'''&lt;br /&gt;
   '''for''' для каждой &amp;lt;tex&amp;gt;v \in V[G]&amp;lt;/tex&amp;gt;&lt;br /&gt;
      &amp;lt;tex&amp;gt; d[v] \leftarrow \mathcal {1} &amp;lt;/tex&amp;gt;&lt;br /&gt;
   &amp;lt;tex&amp;gt;d[s] \leftarrow 0 &amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''for''' &amp;lt;tex&amp;gt; i \leftarrow 1 &amp;lt;/tex&amp;gt; '''to''' &amp;lt;tex&amp;gt; \mid V[G] \mid - 1 &amp;lt;/tex&amp;gt;&lt;br /&gt;
      '''for''' для каждого ребра &amp;lt;tex&amp;gt; (u, v) \in E[G] &amp;lt;/tex&amp;gt;&lt;br /&gt;
            '''if''' &amp;lt;tex&amp;gt;d[v] &amp;gt; d[u] + \omega(u, v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
                  '''then''' &amp;lt;tex&amp;gt;d[v] \leftarrow d[u] + \omega(u, v)&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''for''' для каждого ребра &amp;lt;tex&amp;gt; (u, v) \in E[G] &amp;lt;/tex&amp;gt;&lt;br /&gt;
      '''if''' &amp;lt;tex&amp;gt;d[v] &amp;gt; d[u] + \omega(u, v) &amp;lt;/tex&amp;gt;&lt;br /&gt;
            '''then''' '''return''' &amp;lt;tex&amp;gt; \mathit false&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''return''' &amp;lt;tex&amp;gt; \mathit true &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Корректность алгоритма Форда-Беллмана==&lt;br /&gt;
:В этом алгоритме используется релаксация, в результате которой &amp;lt;tex&amp;gt;d[v]&amp;lt;/tex&amp;gt; уменьшается до тех пор, пока не станет равным &amp;lt;tex&amp;gt;\delta(s, v)&amp;lt;/tex&amp;gt;. &amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;tex&amp;gt;d[v]&amp;lt;/tex&amp;gt; - оценка веса кратчайшего пути из вершины &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt; в каждую вершину &amp;lt;tex&amp;gt;v \in V&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
:&amp;lt;tex&amp;gt;\delta(s, 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;.&lt;br /&gt;
&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;br&amp;gt;Тогда после завершения &amp;lt;tex&amp;gt; \mid V[G] \mid - 1 &amp;lt;/tex&amp;gt; итераций цикла для всех вершин, достижимых из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;, выполняется равенство &amp;lt;tex&amp;gt; d[v] = \delta (s, v) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=:Рассмотрим произвольную вершину &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;, достижимую из &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Пусть &amp;lt;tex&amp;gt;p = \langle v_0,..., v_{k} \rangle &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;v_0 = s&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;v_{k} = 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;br&amp;gt;&lt;br /&gt;
:Путь &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt; содержит не более &amp;lt;tex&amp;gt; \mid V[G] \mid - 1 &amp;lt;/tex&amp;gt; ребер. Поэтому &amp;lt;tex&amp;gt;k \le \mid V[G] \mid - 1&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: Докажем следующее утверждение: &lt;br /&gt;
:: После &amp;lt;tex&amp;gt;n : (n \le k)&amp;lt;/tex&amp;gt; итераций первого цикла алгоритма, &amp;lt;tex&amp;gt;d[v_n] = \delta(s, v_n) &amp;lt;/tex&amp;gt;&lt;br /&gt;
: Воспользуемся индукцией по &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;:&lt;br /&gt;
: '''База индукции.''' Перед первой итерацией утверждение очевидно выполнено: &amp;lt;tex&amp;gt;d[v_0] = d[s] = \delta(s, s) = 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
: '''Индукционный переход.''' Пусть после &amp;lt;tex&amp;gt;n : (n &amp;lt; k)&amp;lt;/tex&amp;gt; итераций, верно что &amp;lt;tex&amp;gt;d[v_n] = \delta(s, v_n)&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;(v_n, v_{n + 1})&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;\delta(s, v_{n+1}) = \delta(s, v_n) + \omega(v_n, v_{n + 1})&amp;lt;/tex&amp;gt;. Во время &amp;lt;tex&amp;gt;l + 1&amp;lt;/tex&amp;gt; итерации релаксируется ребро &amp;lt;tex&amp;gt;(v_n,v_{n+1})&amp;lt;/tex&amp;gt;, следовательно по завершению итерации будет выполнено&lt;br /&gt;
::&amp;lt;tex&amp;gt;d[v_{n+1}] \le d[v_n] + \omega(v_n, v_{n+1}) = \delta(s, v_n) + \omega(v_n, v_{n+1}) = \delta(s, v_{n+1})&amp;lt;/tex&amp;gt;.&lt;br /&gt;
: Ясно, что &amp;lt;tex&amp;gt;d[v_{n+1}] \ge \delta(s, v_{n+1}) &amp;lt;/tex&amp;gt;, поэтому верно что после &amp;lt;tex&amp;gt;l + 1&amp;lt;/tex&amp;gt; итерации &amp;lt;tex&amp;gt;d[v_{n+1}] = \delta(s, v_{n + 1})&amp;lt;/tex&amp;gt;. &lt;br /&gt;
: Индукционный переход доказан.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
: Итак, выполнены равенства &amp;lt;tex&amp;gt;d[v] = d[v_{k}] = \delta (s, v_{k}) = \delta (s, v))&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&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;br&amp;gt;Если граф &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; не содержит отрицательных циклов, достижимых из вершины &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;, то алгоритм возвращает &amp;lt;tex&amp;gt; true &amp;lt;/tex&amp;gt; и для всех &amp;lt;tex&amp;gt; v \in V[G] \  d[v] = \delta (s, v)&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;Если граф &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; содержит отрицательные циклы, достижимые из вершины &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;, то алгоритм возвращает &amp;lt;tex&amp;gt; false &amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=:Пусть граф &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; не содержит отрицательных циклов, достижимых из вершины &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
:Тогда если вершина &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; достижима из &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;, то по лемме &amp;lt;tex&amp;gt; d[v] = \delta (s, v)&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
:Если вершина &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; не достижима из &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; d[v] = \delta (s, v) = \mathcal {1}&amp;lt;/tex&amp;gt; из несуществования пути. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Теперь докажем, что алгоритм вернет значение &amp;lt;tex&amp;gt; true &amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
:После выполнения алгоритма верно, что для всех &amp;lt;tex&amp;gt; (u, v) \in E[G], \  d[v] = \delta (s, v) \leqslant \delta (s, u) + \omega (u,v) = d[u] + \omega (u,v)&amp;lt;/tex&amp;gt;, значит ни одна из проверок не вернет значения &amp;lt;tex&amp;gt; false &amp;lt;/tex&amp;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; c = {v_0,...,v_{k}} &amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; v_0 = v_{k} &amp;lt;/tex&amp;gt;, достижимый из вершины &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
:Тогда &amp;lt;tex&amp;gt;\sum\limits_{i=1}^{k} {\omega (v_{i-1}, v_{i})} &amp;lt; 0 &amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
:Предположим, что алгоритм возвращает &amp;lt;tex&amp;gt; true &amp;lt;/tex&amp;gt;, тогда для &amp;lt;tex&amp;gt; i = 1,...,k &amp;lt;/tex&amp;gt; выполняется &amp;lt;tex&amp;gt; d[v_{i}] \leqslant d[v_{i-1}] + \omega (v_{i-1}, v_{i}) &amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
:Просуммируем эти неравенства по всему циклу: &amp;lt;tex&amp;gt;\sum\limits_{i=1}^{k} {d[v_{i}]} \leqslant \sum\limits_{i=1}^{k} {d[v_{i-1}]} + \sum\limits_{i=1}^{k} {\omega (v_{i-1}, v_{i})} &amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
:Из того, что &amp;lt;tex&amp;gt; v_0 = v_{k} &amp;lt;/tex&amp;gt; следует, что &amp;lt;tex&amp;gt; \sum\limits^{k}_{i=1} {d[v_{i}]} = \sum \limits_{i=1}^{k} {d[v_{i - 1}]} &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:Получили, что &amp;lt;tex&amp;gt; \sum \limits_{i=1}^{k} {\omega (v_{i-1}, v_{i})} \ge 0 &amp;lt;/tex&amp;gt;, что противоречит отрицательности цикла &amp;lt;tex&amp;gt; c &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Сложность==&lt;br /&gt;
:Инициализация занимает &amp;lt;tex&amp;gt; \Theta (V) &amp;lt;/tex&amp;gt; времени, каждый из &amp;lt;tex&amp;gt; \mid V[G] \mid - 1 &amp;lt;/tex&amp;gt; проходов требует &amp;lt;tex&amp;gt; \Theta (E) &amp;lt;/tex&amp;gt; времени, обход по всем ребрам для проверки наличия отрицательного цикла занимает &amp;lt;tex&amp;gt;O(E)&amp;lt;/tex&amp;gt; времени.&amp;lt;br&amp;gt;Итого алгоритм Беллмана-Форда работает за &amp;lt;tex&amp;gt;O(V E)&amp;lt;/tex&amp;gt; времени.&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
:Кормен, Т., Лейзерсон, Ч., Ривест, Р., Штайн, К. Алгоритмы: построение и анализ / пер. с англ. — изд. 2-е — М.: Издательский дом «Вильямс», 2009. — с.672 — 676. — ISBN 978-5-8459-0857-5.&lt;br /&gt;
:[http://e-maxx.ru/algo/export_ford_bellman Алгоритм Форда-Беллмана]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Кратчайшие пути в графах]]&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%85%D0%BE%D0%B4_%D0%B2_%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83&amp;diff=12540</id>
		<title>Обход в ширину</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%85%D0%BE%D0%B4_%D0%B2_%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83&amp;diff=12540"/>
				<updated>2011-11-01T03:29:34Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: /* Реализация */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}&lt;br /&gt;
'''Обход в ширину''' ('''Поиск в ширину, BFS''', '''Breadth-first search''') — один из простейших алгоритмов обхода графа, являющийся основой для многих важных алгоритмов для работы с графами.&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;s&amp;lt;/tex&amp;gt;. Для алгоритма нам потребуются очередь, которая сначала содержит только &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;, и множество посещенных вершин &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt;, которое изначально тоже содержит только &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;. На каждом шаге алгоритм вынимает из начала очереди вершину, рассматривает все исходящие из нее ребра и добавляет все связанные с ней непосещенные вершины в &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; и в конец очереди. Если очередь пуста, то алгоритм завершает работу.&lt;br /&gt;
&lt;br /&gt;
Поиск в ширину также может построить дерево поиска в ширину. Изначально оно состоит из одного корня &amp;lt;tex&amp;gt; s &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 &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Также можно для каждой вершины &amp;lt;tex&amp;gt; t \in V &amp;lt;/tex&amp;gt; считать длину этого пути, равную &amp;lt;tex&amp;gt; d[t] &amp;lt;/tex&amp;gt;. Можно считать, что для непосещенных вершин эта длина бесконечно велика. Тогда на каждом шаге длина пути до &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; равна &amp;lt;tex&amp;gt; \rho(s, t) &amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; посещена и &amp;lt;tex&amp;gt; \infty &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;
Оценим время работы для входного графа &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;. В очередь добавляются только непосещенные вершины, поэтому каждая вершина посещается не более одного раза. Операции внесения в очередь и удаления из нее требуют &amp;lt;tex&amp;gt; O(1) &amp;lt;/tex&amp;gt; времени, так что общее время работы с очередью составляет &amp;lt;tex&amp;gt; O(|V|) &amp;lt;/tex&amp;gt; операций. Для каждой вершины &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; рассматривается не более &amp;lt;tex&amp;gt; deg\ v &amp;lt;/tex&amp;gt; ребер, инцидентных ей. Так как &amp;lt;tex&amp;gt; \sum_{v \in V} deg\ v = 2|E| &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;
=== Корректность ===&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
В алгоритме поиска в ширину очередь всегда содержит сначала некоторое количество вершин с расстоянием k, а потом некоторое количество вершин с расстоянием k + 1(возможно, нулевое).&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем это утверждение индукцией по числу выполненных алгоритмом шагов.&lt;br /&gt;
&lt;br /&gt;
База: изначально очередь содержит только одну вершину &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; с расстоянием 0, утверждение верно. &lt;br /&gt;
&lt;br /&gt;
Переход: пусть после &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt;-ого шага алгоритма очередь содержит &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; q &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;. Тогда на &amp;lt;tex&amp;gt; l+1 &amp;lt;/tex&amp;gt;-ом шаге мы извлечем из очереди одну вершину и добавим в нее все непосещенные(&amp;lt;tex&amp;gt; r &amp;lt;/tex&amp;gt; вершин), связанные с ней; расстояние до них, очевидно, будет равно &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;. У нас останется &amp;lt;tex&amp;gt; p - 1 &amp;lt;/tex&amp;gt;(возможно, 0) вершин с расстоянием &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; q + r &amp;lt;/tex&amp;gt; вершин с расстоянием k + 1, что соответствует нашему инварианту.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Алгоритм поиска в ширину в невзвешенном графе находит оптимальные расстояния до всех достижимых вершин.&lt;br /&gt;
|proof=&lt;br /&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; v &amp;lt;/tex&amp;gt;, а предок в оптимальном пути до &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; — вершина &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt;. Расстояние до вершин &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; найдено корректно, путь через &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; оптимальный, а через &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; — нет, поэтому &amp;lt;tex&amp;gt; d[w] &amp;lt; d[v] &amp;lt;/tex&amp;gt;. Из ранее доказанной леммы следует, что в этом случае вершина &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; попала в очередь и была обработана раньше, чем &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;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; u &amp;lt;/tex&amp;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; s &amp;lt;/tex&amp;gt; - выделенная вершина, Q - очередь. Множество &amp;lt;tex&amp;gt; X &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;d[u]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''BFS'''(&amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;)&lt;br /&gt;
 1    d[s] &amp;lt;tex&amp;gt; \leftarrow &amp;lt;/tex&amp;gt; 0&lt;br /&gt;
 2    Q &amp;lt;tex&amp;gt; \leftarrow \emptyset &amp;lt;/tex&amp;gt;&lt;br /&gt;
 3    Q.push(s)&lt;br /&gt;
 4    '''while''' Q &amp;lt;tex&amp;gt; \ne \emptyset &amp;lt;/tex&amp;gt; &lt;br /&gt;
 5      '''do''' u &amp;lt;tex&amp;gt; \leftarrow &amp;lt;/tex&amp;gt; Q.pop&lt;br /&gt;
 6        '''for''' v: uv &amp;lt;tex&amp;gt; \in &amp;lt;/tex&amp;gt; E&lt;br /&gt;
 7          '''do''' '''if''' d[v] = &amp;lt;tex&amp;gt; \infty &amp;lt;/tex&amp;gt;&lt;br /&gt;
 8            '''then''' d[v] &amp;lt;tex&amp;gt; \leftarrow &amp;lt;/tex&amp;gt; d[u] + 1&lt;br /&gt;
 9                 Q.push(v)&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&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;br /&gt;
[http://e-maxx.ru/algo/bfs Поиск в ширину на e-maxx.ru]&lt;br /&gt;
&lt;br /&gt;
[http://ru.wikipedia.org/wiki/Поиск_в_ширину Поиск в ширину в Википедии]&lt;br /&gt;
&lt;br /&gt;
[http://rain.ifmo.ru/cat/view.php/vis/graph-general/bfs-2002 Визуализатор алгоритма]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Кратчайшие пути в графах]]&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%85%D0%BE%D0%B4_%D0%B2_%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83&amp;diff=12539</id>
		<title>Обход в ширину</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%85%D0%BE%D0%B4_%D0%B2_%D1%88%D0%B8%D1%80%D0%B8%D0%BD%D1%83&amp;diff=12539"/>
				<updated>2011-11-01T03:27:10Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: /* Корректность */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{В разработке}}&lt;br /&gt;
'''Обход в ширину''' ('''Поиск в ширину, BFS''', '''Breadth-first search''') — один из простейших алгоритмов обхода графа, являющийся основой для многих важных алгоритмов для работы с графами.&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;s&amp;lt;/tex&amp;gt;. Для алгоритма нам потребуются очередь, которая сначала содержит только &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;, и множество посещенных вершин &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt;, которое изначально тоже содержит только &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt;. На каждом шаге алгоритм вынимает из начала очереди вершину, рассматривает все исходящие из нее ребра и добавляет все связанные с ней непосещенные вершины в &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; и в конец очереди. Если очередь пуста, то алгоритм завершает работу.&lt;br /&gt;
&lt;br /&gt;
Поиск в ширину также может построить дерево поиска в ширину. Изначально оно состоит из одного корня &amp;lt;tex&amp;gt; s &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 &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Также можно для каждой вершины &amp;lt;tex&amp;gt; t \in V &amp;lt;/tex&amp;gt; считать длину этого пути, равную &amp;lt;tex&amp;gt; d[t] &amp;lt;/tex&amp;gt;. Можно считать, что для непосещенных вершин эта длина бесконечно велика. Тогда на каждом шаге длина пути до &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; равна &amp;lt;tex&amp;gt; \rho(s, t) &amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt; t &amp;lt;/tex&amp;gt; посещена и &amp;lt;tex&amp;gt; \infty &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;
Оценим время работы для входного графа &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;. В очередь добавляются только непосещенные вершины, поэтому каждая вершина посещается не более одного раза. Операции внесения в очередь и удаления из нее требуют &amp;lt;tex&amp;gt; O(1) &amp;lt;/tex&amp;gt; времени, так что общее время работы с очередью составляет &amp;lt;tex&amp;gt; O(|V|) &amp;lt;/tex&amp;gt; операций. Для каждой вершины &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; рассматривается не более &amp;lt;tex&amp;gt; deg\ v &amp;lt;/tex&amp;gt; ребер, инцидентных ей. Так как &amp;lt;tex&amp;gt; \sum_{v \in V} deg\ v = 2|E| &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;
=== Корректность ===&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
В алгоритме поиска в ширину очередь всегда содержит сначала некоторое количество вершин с расстоянием k, а потом некоторое количество вершин с расстоянием k + 1(возможно, нулевое).&lt;br /&gt;
|proof=&lt;br /&gt;
Докажем это утверждение индукцией по числу выполненных алгоритмом шагов.&lt;br /&gt;
&lt;br /&gt;
База: изначально очередь содержит только одну вершину &amp;lt;tex&amp;gt; s &amp;lt;/tex&amp;gt; с расстоянием 0, утверждение верно. &lt;br /&gt;
&lt;br /&gt;
Переход: пусть после &amp;lt;tex&amp;gt; l &amp;lt;/tex&amp;gt;-ого шага алгоритма очередь содержит &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; q &amp;lt;/tex&amp;gt; вершин с расстоянием &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;. Тогда на &amp;lt;tex&amp;gt; l+1 &amp;lt;/tex&amp;gt;-ом шаге мы извлечем из очереди одну вершину и добавим в нее все непосещенные(&amp;lt;tex&amp;gt; r &amp;lt;/tex&amp;gt; вершин), связанные с ней; расстояние до них, очевидно, будет равно &amp;lt;tex&amp;gt; k + 1 &amp;lt;/tex&amp;gt;. У нас останется &amp;lt;tex&amp;gt; p - 1 &amp;lt;/tex&amp;gt;(возможно, 0) вершин с расстоянием &amp;lt;tex&amp;gt; k &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; q + r &amp;lt;/tex&amp;gt; вершин с расстоянием k + 1, что соответствует нашему инварианту.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Алгоритм поиска в ширину в невзвешенном графе находит оптимальные расстояния до всех достижимых вершин.&lt;br /&gt;
|proof=&lt;br /&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; v &amp;lt;/tex&amp;gt;, а предок в оптимальном пути до &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; — вершина &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt;. Расстояние до вершин &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; найдено корректно, путь через &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; оптимальный, а через &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; — нет, поэтому &amp;lt;tex&amp;gt; d[w] &amp;lt; d[v] &amp;lt;/tex&amp;gt;. Из ранее доказанной леммы следует, что в этом случае вершина &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; попала в очередь и была обработана раньше, чем &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;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; u &amp;lt;/tex&amp;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; s &amp;lt;/tex&amp;gt; - выделенная вершина, Q - очередь. Множество &amp;lt;tex&amp;gt; X &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;d[u]&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 '''BFS'''(&amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;s&amp;lt;/tex&amp;gt;)&lt;br /&gt;
 1    d[s] &amp;lt;tex&amp;gt; \leftarrow &amp;lt;/tex&amp;gt; 0&lt;br /&gt;
 2    Q &amp;lt;tex&amp;gt; \leftarrow \varnothing &amp;lt;/tex&amp;gt;&lt;br /&gt;
 3    Q.push(s)&lt;br /&gt;
 4    '''while''' Q &amp;lt;tex&amp;gt; \ne \varnothing &amp;lt;/tex&amp;gt; &lt;br /&gt;
 5      '''do''' u &amp;lt;tex&amp;gt; \leftarrow &amp;lt;/tex&amp;gt; Q.pop&lt;br /&gt;
 6        '''for''' v: uv &amp;lt;tex&amp;gt; \in &amp;lt;/tex&amp;gt; E&lt;br /&gt;
 7          '''do''' '''if''' d[v] = &amp;lt;tex&amp;gt; \infty &amp;lt;/tex&amp;gt;&lt;br /&gt;
 8            '''then''' d[v] &amp;lt;tex&amp;gt; \leftarrow &amp;lt;/tex&amp;gt; d[u] + 1&lt;br /&gt;
 9                 Q.push(v)&lt;br /&gt;
&lt;br /&gt;
== Литература ==&lt;br /&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;br /&gt;
[http://e-maxx.ru/algo/bfs Поиск в ширину на e-maxx.ru]&lt;br /&gt;
&lt;br /&gt;
[http://ru.wikipedia.org/wiki/Поиск_в_ширину Поиск в ширину в Википедии]&lt;br /&gt;
&lt;br /&gt;
[http://rain.ifmo.ru/cat/view.php/vis/graph-general/bfs-2002 Визуализатор алгоритма]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Кратчайшие пути в графах]]&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</name></author>	</entry>

	<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_%D1%86%D0%B8%D0%BA%D0%BB%D0%B0_%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_%D1%86%D0%B8%D0%BA%D0%BB%D0%B0&amp;diff=12169</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_%D1%86%D0%B8%D0%BA%D0%BB%D0%B0_%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_%D1%86%D0%B8%D0%BA%D0%BB%D0%B0&amp;diff=12169"/>
				<updated>2011-10-27T18:18:18Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если между двумя [[Основные определения теории графов|вершинами неориентированного графа]] существуют два различных рёберно-простых [[Основные определения теории графов|пути]], то в этом графе существует простой цикл.&lt;br /&gt;
|proof=&lt;br /&gt;
Возьмём два существующих пути между нужными нам вершинами: &amp;lt;tex&amp;gt;V_0E_1V_1E_2V_2 ... E_nV_n&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;v_0e_1v_1e_2v_2 ... e_mv_m&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;V_0 = v_0&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;V_n = v_m&amp;lt;/tex&amp;gt;. Удалим из путей одинаковые префиксы и суффиксы, оставив из тех только последние и первые вершины, соответственно. Оставшиеся пути: &amp;lt;tex&amp;gt;V_aE_{a+1} ... E_bV_b&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;v_ae_{a+1} ... e_cv_c&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;V_a = v_a&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;V_b = v_c&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;E_{a+1} \neq e_{a+1}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;E_b \neq e_c&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим конкатенацию первого нового пути и развёрнутого второго нового пути. Она будет циклом, так как начальная и конечная вершины совпадают, изначально пути были рёберно-простыми, а в точке соединения, равно как и в точке замыкания цикла, условие различности двух идущих подряд рёбер выполняется. Мы получили цикл, определим его: &amp;lt;tex&amp;gt;V_0E_1V_1 ... E_kV_k&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;V_0 = V_k&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_i&amp;lt;/tex&amp;gt; будет содержаться ровно один раз.&lt;br /&gt;
Начнём процесс с вершины &amp;lt;tex&amp;gt;V_1&amp;lt;/tex&amp;gt; и будем повторять его каждый раз для следующей вершины нового цикла, пока не дойдём до последней. По построению, получившийся цикл будет содержать каждую из вершин графа не более одного раза, а значит, будет простым.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Файл: prime_c.png|thumb|500px|center|Для вершины 2 находим последнее ее вхождение в цикл и удаляем отрезок цикла (2, 5)-5-(5, 6)-6-(6, 4)-4-(4, 2)-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;
в общем случае неверно, так как эти вершины могут лежать в разных компонентах вершинной или рёберной двусвязности: все пути из одной вершины в другую будут содержать одну и ту же точку сочленения или один и тот же мост.&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>Chuprikov Pavel</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D0%B8_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=12168</id>
		<title>Основные определения теории графов</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D0%B8_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=12168"/>
				<updated>2011-10-27T18:08:42Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: /* Неориентированные графы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Ориентированные графы==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Ориентированным графом''' (directed graph) &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; называется пара &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; {{---}} конечное множество вершин, а &amp;lt;tex&amp;gt; E \subset V \times V &amp;lt;/tex&amp;gt; {{---}} множество рёбер. '''Ребром''' (edge, дугой(arc), линией(line)) ориентированного графа называют упорядоченную пару вершин &amp;lt;tex&amp;gt; (v, u) \in E &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
В графе ребро, концы которого совпадают, то есть &amp;lt;tex&amp;gt;e=(v,v)&amp;lt;/tex&amp;gt;, называется &amp;lt;b&amp;gt;петлей&amp;lt;/b&amp;gt;. Мультиграф с петлями принято называть '''псевдографом'''.&lt;br /&gt;
&lt;br /&gt;
Если имеется ребро &amp;lt;tex&amp;gt; (v, u) \in E &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 &amp;lt;/tex&amp;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; {{---}} '''смежные'''&lt;br /&gt;
* Вершина &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; '''инцидентна''' ребру &amp;lt;tex&amp;gt; (v, u) &amp;lt;/tex&amp;gt;, вершина &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; '''инцидентна''' ребру &amp;lt;tex&amp;gt; (v, u) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что '''инцидентность''' {{---}} понятие, используемое только в отношении ребра и вершины. Две вершины или два ребра не могут быть инцидентны.&lt;br /&gt;
&lt;br /&gt;
Граф с &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt; вершинами и &amp;lt;tex&amp;gt; q &amp;lt;/tex&amp;gt; ребрами называют &amp;lt;tex&amp;gt; (p, q) &amp;lt;/tex&amp;gt; - графом.  &amp;lt;tex&amp;gt; (1, 0) &amp;lt;/tex&amp;gt;-граф называют &amp;lt;b&amp;gt;тривиальным&amp;lt;/b&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;(u, v)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Поэтому часто используют другое определение. &lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Ориентированным графом''' &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; называется четверка &amp;lt;tex&amp;gt;G = (V, E, beg, end)&amp;lt;/tex&amp;gt; , где &amp;lt;tex&amp;gt;beg, end : E \rightarrow 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; {{---}} некоторые абстрактные множества.&lt;br /&gt;
}}&lt;br /&gt;
Иногда граф, построенный таким образом называют '''мультиграфом'''. В мультиграфе не допускаются петли, но пары вершин допускается соединять более чем одним ребром. Такие ребра называются '''кратными''' (иначе {{---}} '''параллельные''').&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; width=30% align=center&lt;br /&gt;
|[[Файл: directed_graph.png|thumb|300px|center|&amp;lt;font color=#ED1C24&amp;gt;Красным&amp;lt;/font&amp;gt; выделено кратное ребро (6, 2)&amp;lt;br&amp;gt;&amp;lt;font color=#22B14C&amp;gt;Зеленым&amp;lt;/font&amp;gt; обозначена петля (6, 6)]]&lt;br /&gt;
|[[Файл: Multigraph.png|thumb|300px|center|а) Мультиграф&amp;lt;br&amp;gt; б) Псевдограф]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Так же для ориентированных графов определяют '''полустепень исхода вершины''' &amp;lt;tex&amp;gt;deg^-v_i = |\{e~|beg~e = v\}|&amp;lt;/tex&amp;gt; и '''полустепень захода вершины''' &amp;lt;tex&amp;gt;deg^+v_i = |\{e~|end~e = v\}|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как у каждого ребра ровно одно начало и ровно один конец выполнено следующее равенство:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{v\in V(G)}deg^-v_i = \sum\limits_{v\in V(G)}deg^+v_i = |E|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Путём'''(маршрутом) в графе называется последовательность вида &amp;lt;tex&amp;gt;v_0 e_1 v_1 ... e_k v_k&amp;lt;/tex&amp;gt;,  где &amp;lt;tex&amp;gt;e_i \in E,~e_i = (v_{i-1}, v_i)&amp;lt;/tex&amp;gt;; &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {{---}} '''длина''' пути.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Циклическим путём''' называется путь, в котором &amp;lt;tex&amp;gt;v_0 = v_k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Цикл''' - это класс эквивалентности циклических путей на отношении эквивалентности таком, что два пути эквивалентны, если &amp;lt;tex&amp;gt; \exists  j : \forall i \Rightarrow e_{(i \mod k)} = e'_{(i + j) \mod k}&amp;lt;/tex&amp;gt;; где &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; {{---}} это две последовательности ребер в циклическом пути.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Неориентированные графы==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Неориентированным графом''' (undirected graph) &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; называется пара &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; {{---}} конечное множество вершин, а &amp;lt;tex&amp;gt; E \subset V \times V(uv \sim vu~\backslash~\{uu~|~u \in V\})&amp;lt;/tex&amp;gt; {{---}} множество рёбер. '''Ребром''' в неориентированном графе называют неупорядоченную пару вершин &amp;lt;tex&amp;gt; (v, u) \in E &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
[[Файл: Неорграф.png|thumb|300px|center|Неориентированный граф&amp;lt;br&amp;gt;]]&lt;br /&gt;
Иное определение:&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Неориентированным графом''' &amp;lt;tex&amp;gt;G = (V, E, ends)&amp;lt;/tex&amp;gt; , где &amp;lt;tex&amp;gt;ends : E \rightarrow V \times 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; {{---}} некоторые абстрактные множества. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Две вершины называются '''смежными''' если между ними есть ребро.&lt;br /&gt;
&lt;br /&gt;
'''Степенью''' вершины &amp;lt;tex&amp;gt;deg~v_i&amp;lt;/tex&amp;gt; в неориентированном называют число ребер, инцидентных &amp;lt;tex&amp;gt;v_i&amp;lt;/tex&amp;gt;. Будем считать, что петли добавляют к степени вершины &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Циклическим путём''' в неориентированном графе называется путь, в котором &amp;lt;tex&amp;gt;v_0 = v_k&amp;lt;/tex&amp;gt;, а так же &amp;lt;tex&amp;gt; e_i \ne e_{(i+1) \mod k}&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;
* Харари Фрэнк '''Теория графов''' = Graph theory/Пер. с англ. и предисл. В. П. Козырева. Под ред. Г.П.Гаврилова. Изд. 2-е. — М.: Едиториал УРСС, 2003. — 296 с. — ISBN 5-354-00301-6&lt;br /&gt;
* Асанов М. О., Баранский В. А., Расин В. В. '''Дискретная математика: графы, матроиды, алгоритмы''' — НИЦ РХД, 2001. — 288 с. — ISBN 5-93972-076-5&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;br /&gt;
[[Категория: Основные определения теории графов]]&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D0%B8_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=12167</id>
		<title>Основные определения теории графов</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D0%B8_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=12167"/>
				<updated>2011-10-27T18:07:43Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: /* Ориентированные графы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Ориентированные графы==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Ориентированным графом''' (directed graph) &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; называется пара &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; {{---}} конечное множество вершин, а &amp;lt;tex&amp;gt; E \subset V \times V &amp;lt;/tex&amp;gt; {{---}} множество рёбер. '''Ребром''' (edge, дугой(arc), линией(line)) ориентированного графа называют упорядоченную пару вершин &amp;lt;tex&amp;gt; (v, u) \in E &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
В графе ребро, концы которого совпадают, то есть &amp;lt;tex&amp;gt;e=(v,v)&amp;lt;/tex&amp;gt;, называется &amp;lt;b&amp;gt;петлей&amp;lt;/b&amp;gt;. Мультиграф с петлями принято называть '''псевдографом'''.&lt;br /&gt;
&lt;br /&gt;
Если имеется ребро &amp;lt;tex&amp;gt; (v, u) \in E &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 &amp;lt;/tex&amp;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; {{---}} '''смежные'''&lt;br /&gt;
* Вершина &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; '''инцидентна''' ребру &amp;lt;tex&amp;gt; (v, u) &amp;lt;/tex&amp;gt;, вершина &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; '''инцидентна''' ребру &amp;lt;tex&amp;gt; (v, u) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что '''инцидентность''' {{---}} понятие, используемое только в отношении ребра и вершины. Две вершины или два ребра не могут быть инцидентны.&lt;br /&gt;
&lt;br /&gt;
Граф с &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt; вершинами и &amp;lt;tex&amp;gt; q &amp;lt;/tex&amp;gt; ребрами называют &amp;lt;tex&amp;gt; (p, q) &amp;lt;/tex&amp;gt; - графом.  &amp;lt;tex&amp;gt; (1, 0) &amp;lt;/tex&amp;gt;-граф называют &amp;lt;b&amp;gt;тривиальным&amp;lt;/b&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;(u, v)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Поэтому часто используют другое определение. &lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Ориентированным графом''' &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; называется четверка &amp;lt;tex&amp;gt;G = (V, E, beg, end)&amp;lt;/tex&amp;gt; , где &amp;lt;tex&amp;gt;beg, end : E \rightarrow 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; {{---}} некоторые абстрактные множества.&lt;br /&gt;
}}&lt;br /&gt;
Иногда граф, построенный таким образом называют '''мультиграфом'''. В мультиграфе не допускаются петли, но пары вершин допускается соединять более чем одним ребром. Такие ребра называются '''кратными''' (иначе {{---}} '''параллельные''').&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; width=30% align=center&lt;br /&gt;
|[[Файл: directed_graph.png|thumb|300px|center|&amp;lt;font color=#ED1C24&amp;gt;Красным&amp;lt;/font&amp;gt; выделено кратное ребро (6, 2)&amp;lt;br&amp;gt;&amp;lt;font color=#22B14C&amp;gt;Зеленым&amp;lt;/font&amp;gt; обозначена петля (6, 6)]]&lt;br /&gt;
|[[Файл: Multigraph.png|thumb|300px|center|а) Мультиграф&amp;lt;br&amp;gt; б) Псевдограф]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Так же для ориентированных графов определяют '''полустепень исхода вершины''' &amp;lt;tex&amp;gt;deg^-v_i = |\{e~|beg~e = v\}|&amp;lt;/tex&amp;gt; и '''полустепень захода вершины''' &amp;lt;tex&amp;gt;deg^+v_i = |\{e~|end~e = v\}|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как у каждого ребра ровно одно начало и ровно один конец выполнено следующее равенство:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{v\in V(G)}deg^-v_i = \sum\limits_{v\in V(G)}deg^+v_i = |E|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Путём'''(маршрутом) в графе называется последовательность вида &amp;lt;tex&amp;gt;v_0 e_1 v_1 ... e_k v_k&amp;lt;/tex&amp;gt;,  где &amp;lt;tex&amp;gt;e_i \in E,~e_i = (v_{i-1}, v_i)&amp;lt;/tex&amp;gt;; &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {{---}} '''длина''' пути.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Циклическим путём''' называется путь, в котором &amp;lt;tex&amp;gt;v_0 = v_k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Цикл''' - это класс эквивалентности циклических путей на отношении эквивалентности таком, что два пути эквивалентны, если &amp;lt;tex&amp;gt; \exists  j : \forall i \Rightarrow e_{(i \mod k)} = e'_{(i + j) \mod k}&amp;lt;/tex&amp;gt;; где &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; {{---}} это две последовательности ребер в циклическом пути.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Неориентированные графы==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Неориентированным графом''' (undirected graph) &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; называется пара &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; - конечное множество вершин, а &amp;lt;tex&amp;gt; E \subset V \times V(uv \sim vu~\backslash~\{uu~|~u \in V\})&amp;lt;/tex&amp;gt; - множество рёбер. '''Ребром''' в неориентированном графе называют неупорядоченную пару вершин &amp;lt;tex&amp;gt; (v, u) \in E &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
[[Файл: Неорграф.png|thumb|300px|center|Неориентированный граф&amp;lt;br&amp;gt;]]&lt;br /&gt;
Иное определение:&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Неориентированным графом''' &amp;lt;tex&amp;gt;G = (V, E, ends)&amp;lt;/tex&amp;gt; , где &amp;lt;tex&amp;gt;ends : E \rightarrow V \times 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; - некоторые абстрактные множества. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Две вершины называются '''смежными''' если между ними есть ребро.&lt;br /&gt;
&lt;br /&gt;
'''Степеню''' вершины &amp;lt;tex&amp;gt;deg~v_i&amp;lt;/tex&amp;gt; в неориентированном называют число ребер, инцидентных &amp;lt;tex&amp;gt;v_i&amp;lt;/tex&amp;gt;. Будем считать, что петли добавляют к степени вершины &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Циклическим путём''' в неориентированном графе называется путь, в котором &amp;lt;tex&amp;gt;v_0 = v_k&amp;lt;/tex&amp;gt;, а так же &amp;lt;tex&amp;gt; e_i \ne e_{(i+1) \mod k}&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;
* Харари Фрэнк '''Теория графов''' = Graph theory/Пер. с англ. и предисл. В. П. Козырева. Под ред. Г.П.Гаврилова. Изд. 2-е. — М.: Едиториал УРСС, 2003. — 296 с. — ISBN 5-354-00301-6&lt;br /&gt;
* Асанов М. О., Баранский В. А., Расин В. В. '''Дискретная математика: графы, матроиды, алгоритмы''' — НИЦ РХД, 2001. — 288 с. — ISBN 5-93972-076-5&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;br /&gt;
[[Категория: Основные определения теории графов]]&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D0%B8_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=12166</id>
		<title>Основные определения теории графов</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D0%B8_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=12166"/>
				<updated>2011-10-27T18:05:24Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: /* Ориентированные графы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Ориентированные графы==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Ориентированным графом''' (directed graph) &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; называется пара &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; - конечное множество вершин, а &amp;lt;tex&amp;gt; E \subset V \times V &amp;lt;/tex&amp;gt; - множество рёбер. '''Ребром''' (edge, дугой(arc), линией(line)) ориентированного графа называют упорядоченную пару вершин &amp;lt;tex&amp;gt; (v, u) \in E &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
В графе ребро, концы которого совпадают, то есть &amp;lt;tex&amp;gt;e=(v,v)&amp;lt;/tex&amp;gt;, называется &amp;lt;b&amp;gt;петлей&amp;lt;/b&amp;gt;. Мультиграф с петлями принято называть '''псевдографом'''.&lt;br /&gt;
&lt;br /&gt;
Если имеется ребро &amp;lt;tex&amp;gt; (v, u) \in E &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 &amp;lt;/tex&amp;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; {{---}} '''смежные'''&lt;br /&gt;
* Вершина &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; '''инцидентна''' ребру &amp;lt;tex&amp;gt; (v, u) &amp;lt;/tex&amp;gt;, вершина &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; '''инцидентна''' ребру &amp;lt;tex&amp;gt; (v, u) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что '''инцидентность''' {{---}} понятие, используемое только в отношении ребра и вершины. Две вершины или два ребра не могут быть инцидентны.&lt;br /&gt;
&lt;br /&gt;
Граф с &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt; вершинами и &amp;lt;tex&amp;gt; q &amp;lt;/tex&amp;gt; ребрами называют &amp;lt;tex&amp;gt; (p, q) &amp;lt;/tex&amp;gt; - графом.  &amp;lt;tex&amp;gt; (1, 0) &amp;lt;/tex&amp;gt;  - граф называют &amp;lt;b&amp;gt;тривиальным&amp;lt;/b&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;(u, v)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Поэтому часто используют другое определение. &lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Ориентированным графом''' &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; называется четверка &amp;lt;tex&amp;gt;G = (V, E, beg, end)&amp;lt;/tex&amp;gt; , где &amp;lt;tex&amp;gt;beg, end : E \rightarrow 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; - некоторые абстрактные множества.&lt;br /&gt;
}}&lt;br /&gt;
Иногда граф, построенный таким образом называют '''мультиграфом'''. В мультиграфе не допускаются петли, но пары вершин допускается соединять более чем одним ребром. Такие ребра называются '''кратными''' (иначе - '''параллельные''').&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; width=30% align=center&lt;br /&gt;
|[[Файл: directed_graph.png|thumb|300px|center|&amp;lt;font color=#ED1C24&amp;gt;Красным&amp;lt;/font&amp;gt; выделено кратное ребро (6, 2)&amp;lt;br&amp;gt;&amp;lt;font color=#22B14C&amp;gt;Зеленым&amp;lt;/font&amp;gt; обозначена петля (6, 6)]]&lt;br /&gt;
|[[Файл: Multigraph.png|thumb|300px|center|а) Мультиграф&amp;lt;br&amp;gt; б) Псевдограф]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Так же для ориентированных графов определяют '''полустепень исхода вершины''' &amp;lt;tex&amp;gt;deg^-v_i = |\{e~|beg~e = v\}|&amp;lt;/tex&amp;gt; и '''полустепень захода вершины''' &amp;lt;tex&amp;gt;deg^+v_i = |\{e~|end~e = v\}|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как у каждого ребра ровно одно начало и ровно один конец выполнено следующее равенство:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{v\in V(G)}deg^-v_i = \sum\limits_{v\in V(G)}deg^+v_i = |E|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Путём'''(маршрутом) в графе называется последовательность вида &amp;lt;tex&amp;gt;v_0 e_1 v_1 ... e_k v_k&amp;lt;/tex&amp;gt;,  где &amp;lt;tex&amp;gt;e_i \in E,~e_i = (v_{i-1}, v_i)&amp;lt;/tex&amp;gt;; &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {{---}} '''длина''' пути.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Циклическим путём''' называется путь, в котором &amp;lt;tex&amp;gt;v_0 = v_k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Цикл''' - это класс эквивалентности циклических путей на отношении эквивалентности таком, что два пути эквивалентны, если &amp;lt;tex&amp;gt; \exists  j : \forall i \Rightarrow e_{(i \mod k)} = e'_{(i + j) \mod k}&amp;lt;/tex&amp;gt;; где &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; - это две последовательности ребер в циклическом пути.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Неориентированные графы==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Неориентированным графом''' (undirected graph) &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; называется пара &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; - конечное множество вершин, а &amp;lt;tex&amp;gt; E \subset V \times V(uv \sim vu~\backslash~\{uu~|~u \in V\})&amp;lt;/tex&amp;gt; - множество рёбер. '''Ребром''' в неориентированном графе называют неупорядоченную пару вершин &amp;lt;tex&amp;gt; (v, u) \in E &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
[[Файл: Неорграф.png|thumb|300px|center|Неориентированный граф&amp;lt;br&amp;gt;]]&lt;br /&gt;
Иное определение:&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Неориентированным графом''' &amp;lt;tex&amp;gt;G = (V, E, ends)&amp;lt;/tex&amp;gt; , где &amp;lt;tex&amp;gt;ends : E \rightarrow V \times 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; - некоторые абстрактные множества. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Две вершины называются '''смежными''' если между ними есть ребро.&lt;br /&gt;
&lt;br /&gt;
'''Степеню''' вершины &amp;lt;tex&amp;gt;deg~v_i&amp;lt;/tex&amp;gt; в неориентированном называют число ребер, инцидентных &amp;lt;tex&amp;gt;v_i&amp;lt;/tex&amp;gt;. Будем считать, что петли добавляют к степени вершины &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Циклическим путём''' в неориентированном графе называется путь, в котором &amp;lt;tex&amp;gt;v_0 = v_k&amp;lt;/tex&amp;gt;, а так же &amp;lt;tex&amp;gt; e_i \ne e_{(i+1) \mod k}&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;
* Харари Фрэнк '''Теория графов''' = Graph theory/Пер. с англ. и предисл. В. П. Козырева. Под ред. Г.П.Гаврилова. Изд. 2-е. — М.: Едиториал УРСС, 2003. — 296 с. — ISBN 5-354-00301-6&lt;br /&gt;
* Асанов М. О., Баранский В. А., Расин В. В. '''Дискретная математика: графы, матроиды, алгоритмы''' — НИЦ РХД, 2001. — 288 с. — ISBN 5-93972-076-5&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;br /&gt;
[[Категория: Основные определения теории графов]]&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D0%B8_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=12165</id>
		<title>Основные определения теории графов</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D0%B8_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=12165"/>
				<updated>2011-10-27T17:59:07Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: /* Ориентированные графы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Ориентированные графы==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Ориентированным графом''' (directed graph) &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; называется пара &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; - конечное множество вершин, а &amp;lt;tex&amp;gt; E \subset V \times V &amp;lt;/tex&amp;gt; - множество рёбер. '''Ребром''' (edge, дугой(arc), линией(line)) ориентированного графа называют упорядоченную пару вершин &amp;lt;tex&amp;gt; (v, u) \in E &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
В графе ребро, концы которого совпадают, то есть &amp;lt;tex&amp;gt;e=(v,v)&amp;lt;/tex&amp;gt;, называется &amp;lt;b&amp;gt;петлей&amp;lt;/b&amp;gt;. Мультиграф с петлями принято называть '''псевдографом'''.&lt;br /&gt;
&lt;br /&gt;
Если имеется ребро &amp;lt;tex&amp;gt; (v, u) \in E &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 &amp;lt;/tex&amp;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; {{---}} '''смежные'''&lt;br /&gt;
* Вершина &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; '''инцидентна''' ребру &amp;lt;tex&amp;gt; (v, u) &amp;lt;/tex&amp;gt;, вершина &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; '''инцидентна''' ребру &amp;lt;tex&amp;gt; (v, u) &amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Заметим, что '''инцидентность''' {{---}} понятие, используемое только в отношении ребра и вершины. Две вершины или два ребра не могут быть инцидентны.&lt;br /&gt;
&lt;br /&gt;
Граф с &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt; вершинами и &amp;lt;tex&amp;gt; q &amp;lt;/tex&amp;gt; ребрами называют &amp;lt;tex&amp;gt; (p, q) &amp;lt;/tex&amp;gt; - графом.  &amp;lt;tex&amp;gt; (1, 0) &amp;lt;/tex&amp;gt;  - граф называют &amp;lt;b&amp;gt;тривиальным&amp;lt;/b&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;(u, v)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
Поэтому часто используют другое определение. &lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Ориентированным графом''' &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; называется четверка &amp;lt;tex&amp;gt;G = (V, E, beg, end)&amp;lt;/tex&amp;gt; , где &amp;lt;tex&amp;gt;beg, end : E \rightarrow 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; - некоторые абстрактные множества.&lt;br /&gt;
}}&lt;br /&gt;
Иногда граф, построенный таким образом называют '''мультиграфом'''. В мультиграфе не допускаются петли, но пары вершин допускается соединять более чем одним ребром. Такие ребра называются '''кратными''' (иначе - '''параллельные''').&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; width=30% align=center&lt;br /&gt;
|[[Файл: directed_graph.png|thumb|300px|center|&amp;lt;font color=#ED1C24&amp;gt;Красным&amp;lt;/font&amp;gt; выделено кратное ребро (6, 2)&amp;lt;br&amp;gt;&amp;lt;font color=#22B14C&amp;gt;Зеленым&amp;lt;/font&amp;gt; обозначена петля (6, 6)]]&lt;br /&gt;
|[[Файл: Multigraph.png|thumb|300px|center|а) Мультиграф&amp;lt;br&amp;gt; б) Псевдограф]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Так же для ориентированных графов определяют '''полустепень исхода вершины''' &amp;lt;tex&amp;gt;deg^-v_i = |\{e~|beg~e = v\}|&amp;lt;/tex&amp;gt; и '''полустепень захода вершины''' &amp;lt;tex&amp;gt;deg^+v_i = |\{e~|end~e = v\}|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как у каждого ребра ровно одно начало и ровно один конец выполнено следующее равенство:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{v\in V(G)}deg^-v_i = \sum\limits_{v\in V(G)}deg^+v_i = |E|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Путём'''(маршрутом) в графе называется последовательность вида &amp;lt;tex&amp;gt;v_0 e_1 v_1 ... e_k v_k&amp;lt;/tex&amp;gt;,  где &amp;lt;tex&amp;gt;e_i \in E,~e_i = (v_{i-1}, v_i)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Циклическим путём''' называется путь, в котором &amp;lt;tex&amp;gt;v_0 = v_k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Цикл''' - это класс эквивалентности циклических путей на отношении эквивалентности таком, что два пути эквивалентны, если &amp;lt;tex&amp;gt; \exists  j : \forall i \Rightarrow e_{(i \mod k)} = e'_{(i + j) \mod k}&amp;lt;/tex&amp;gt;; где &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; - это две последовательности ребер в циклическом пути.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Неориентированные графы==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Неориентированным графом''' (undirected graph) &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; называется пара &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; - конечное множество вершин, а &amp;lt;tex&amp;gt; E \subset V \times V(uv \sim vu~\backslash~\{uu~|~u \in V\})&amp;lt;/tex&amp;gt; - множество рёбер. '''Ребром''' в неориентированном графе называют неупорядоченную пару вершин &amp;lt;tex&amp;gt; (v, u) \in E &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
[[Файл: Неорграф.png|thumb|300px|center|Неориентированный граф&amp;lt;br&amp;gt;]]&lt;br /&gt;
Иное определение:&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Неориентированным графом''' &amp;lt;tex&amp;gt;G = (V, E, ends)&amp;lt;/tex&amp;gt; , где &amp;lt;tex&amp;gt;ends : E \rightarrow V \times 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; - некоторые абстрактные множества. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Две вершины называются '''смежными''' если между ними есть ребро.&lt;br /&gt;
&lt;br /&gt;
'''Степеню''' вершины &amp;lt;tex&amp;gt;deg~v_i&amp;lt;/tex&amp;gt; в неориентированном называют число ребер, инцидентных &amp;lt;tex&amp;gt;v_i&amp;lt;/tex&amp;gt;. Будем считать, что петли добавляют к степени вершины &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Циклическим путём''' в неориентированном графе называется путь, в котором &amp;lt;tex&amp;gt;v_0 = v_k&amp;lt;/tex&amp;gt;, а так же &amp;lt;tex&amp;gt; e_i \ne e_{(i+1) \mod k}&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;
* Харари Фрэнк '''Теория графов''' = Graph theory/Пер. с англ. и предисл. В. П. Козырева. Под ред. Г.П.Гаврилова. Изд. 2-е. — М.: Едиториал УРСС, 2003. — 296 с. — ISBN 5-354-00301-6&lt;br /&gt;
* Асанов М. О., Баранский В. А., Расин В. В. '''Дискретная математика: графы, матроиды, алгоритмы''' — НИЦ РХД, 2001. — 288 с. — ISBN 5-93972-076-5&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;br /&gt;
[[Категория: Основные определения теории графов]]&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D0%B8_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=12089</id>
		<title>Основные определения теории графов</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D0%B8_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=12089"/>
				<updated>2011-10-26T19:11:19Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Ориентированные графы==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Ориентированным графом''' (directed graph) &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; называется пара &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; - конечное множество вершин, а &amp;lt;tex&amp;gt; E \subset V \times V &amp;lt;/tex&amp;gt; - множество рёбер.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Заметим, что по такому определению любые две вершины &amp;lt;tex&amp;gt;u,~v&amp;lt;/tex&amp;gt; нельзя соединить более чем одним ребром &amp;lt;tex&amp;gt;(u, v)&amp;lt;/tex&amp;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, E, beg, end)&amp;lt;/tex&amp;gt; , где &amp;lt;tex&amp;gt;beg, end : E \rightarrow 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; - некоторые абстрактные множества. Иногда граф, построенный таким образом называют '''мультиграфом'''. В мультиграфе не допускаются петли (см. определение ниже), но пары вершин допускается соединять более чем одним ребром. Такие ребра называются '''кратными''' (иначе - '''параллельные''').&lt;br /&gt;
{|border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;5&amp;quot; width=30% align=center&lt;br /&gt;
|[[Файл: directed_graph.png|thumb|300px|center|&amp;lt;font color=#ED1C24&amp;gt;Красным&amp;lt;/font&amp;gt; выделено ребро (6, 2)&amp;lt;br&amp;gt;&amp;lt;font color=#22B14C&amp;gt;Зеленым&amp;lt;/font&amp;gt; обозначена петля (6, 6)]]&lt;br /&gt;
|[[Файл: Multigraph.png|thumb|300px|center|а) Мультиграф&amp;lt;br&amp;gt; б) Псевдограф]]&lt;br /&gt;
|}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Ребром''' ориентированного графа называют упорядоченную пару вершин &amp;lt;tex&amp;gt; (v, u) \in E &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
В графе ребро, концы которого совпадают, то есть &amp;lt;tex&amp;gt;e=(v,v)&amp;lt;/tex&amp;gt;, называется &amp;lt;b&amp;gt;петлей&amp;lt;/b&amp;gt;. Мультиграф с петлями принято называть '''псевдографом'''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Если имеется ребро &amp;lt;tex&amp;gt; (v, u) \in E &amp;lt;/tex&amp;gt;, то иногда говорят, что &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; - &amp;lt;b&amp;gt;предок&amp;lt;/b&amp;gt; &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;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;b&amp;gt;смежными&amp;lt;/b&amp;gt;. Граф с &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt; вершинами и &amp;lt;tex&amp;gt; q &amp;lt;/tex&amp;gt; ребрами называют &amp;lt;tex&amp;gt; (p, q) &amp;lt;/tex&amp;gt; - графом.  &amp;lt;tex&amp;gt; (1, 0) &amp;lt;/tex&amp;gt;  - граф называют &amp;lt;b&amp;gt;тривиальным&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же для ориентированных графов определяют '''полустепень входа вершины'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;deg^-v_i = |\{e~|beg~e = v\}|&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;deg^+v_i = |\{e~|end~e = v\}|&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как у каждого ребра ровно одно начало и ровно один конец выполнено следующее равенство:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{v\in V(G)}deg^-v_i = \sum\limits_{v\in V(G)}deg^+v_i = |E|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Путём''' в графе называется последовательность вида &amp;lt;tex&amp;gt;v_0 e_1 v_1 ... e_k v_k&amp;lt;/tex&amp;gt;,  где &amp;lt;tex&amp;gt;e_i = (v_{i-1}, v_i)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Циклическим путём''' называется путь, в котором &amp;lt;tex&amp;gt;v_0 = v_k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Цикл''' - это класс эквивалентности циклических путей на отношении эквивалентности таком, что два пути эквивалентны, если &amp;lt;tex&amp;gt; \exists  j : \forall i \Rightarrow e_{(i \mod k)} = e'_{(i + j) \mod k}&amp;lt;/tex&amp;gt;; где &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; - это две последовательности ребер в циклическом пути.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Неориентированные графы==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Неориентированным графом''' (undirected graph) &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; называется пара &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; - конечное множество вершин, а &amp;lt;tex&amp;gt; E \subset V \times V(uv ~ vu \{uu~|~u \in V\})&amp;lt;/tex&amp;gt; - множество рёбер.&lt;br /&gt;
}}&lt;br /&gt;
[[Файл: Неорграф.png|thumb|300px|right|Неориентированный граф&amp;lt;br&amp;gt;]]&lt;br /&gt;
Иное определение:&lt;br /&gt;
&lt;br /&gt;
'''Неориентированным графом''' &amp;lt;tex&amp;gt;G = (V, E, ends)&amp;lt;/tex&amp;gt; , где &amp;lt;tex&amp;gt;ends : E \rightarrow V \times 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; - некоторые абстрактные множества. &lt;br /&gt;
&lt;br /&gt;
'''Ребром''' в неориентированном графе называют неупорядоченную пару вершин &amp;lt;tex&amp;gt; (v, u) \in E &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Две вершины называются '''смежными''' если между ними есть ребро.&lt;br /&gt;
&lt;br /&gt;
'''Степеню''' вершины &amp;lt;tex&amp;gt;deg~v_i&amp;lt;/tex&amp;gt; в неориентированном называют число ребер, инцидентных &amp;lt;tex&amp;gt;v_i&amp;lt;/tex&amp;gt;. Будем считать, что петли добавляют к степени вершины &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Циклическим путём''' называется путь, в котором &amp;lt;tex&amp;gt;v_0 = v_k&amp;lt;/tex&amp;gt;, а так же &amp;lt;tex&amp;gt; e_i \ne e_{(i+1) \mod k}&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;
'''Ребро(edge) - Дуга(arc) - Линия(line)'''&lt;br /&gt;
&lt;br /&gt;
'''Вершина(vertex) - Узел(node) - Точка(point)'''&lt;br /&gt;
&lt;br /&gt;
'''Путь - Маршрут'''&lt;br /&gt;
&lt;br /&gt;
etc..&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;
* Харари Фрэнк '''Теория графов''' = Graph theory/Пер. с англ. и предисл. В. П. Козырева. Под ред. Г.П.Гаврилова. Изд. 2-е. — М.: Едиториал УРСС, 2003. — 296 с. — ISBN 5-354-00301-6&lt;br /&gt;
* Асанов М. О., Баранский В. А., Расин В. В. '''Дискретная математика: графы, матроиды, алгоритмы''' — НИЦ РХД, 2001. — 288 с. — ISBN 5-93972-076-5&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;br /&gt;
[[Категория: Основные определения теории графов]]&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D0%B8_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=12087</id>
		<title>Основные определения теории графов</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D0%B8_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=12087"/>
				<updated>2011-10-26T19:01:17Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: /* Ориентированные графы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Ориентированные графы==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Ориентированным графом''' (directed graph) &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; называется пара &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; - конечное множество вершин, а &amp;lt;tex&amp;gt; E \subset V \times V &amp;lt;/tex&amp;gt; - множество рёбер.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Заметим, что по такому определению любые две вершины &amp;lt;tex&amp;gt;u,~v&amp;lt;/tex&amp;gt; нельзя соединить более чем одним ребром &amp;lt;tex&amp;gt;(u, v)&amp;lt;/tex&amp;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, E, beg, end)&amp;lt;/tex&amp;gt; , где &amp;lt;tex&amp;gt;beg, end : E \rightarrow 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; - некоторые абстрактные множества. Иногда граф, построенный таким образом называют '''мультиграфом'''. В мультиграфе не допускаются петли (см. определение ниже), но пары вершин допускается соединять более чем одним ребром. Такие ребра называются '''кратными''' (иначе - '''параллельные''').&lt;br /&gt;
&lt;br /&gt;
[[Файл: directed_graph.png|thumb|300px|center|Ориентированный граф&amp;lt;br&amp;gt;&amp;lt;font color=#ED1C24&amp;gt;Красным&amp;lt;/font&amp;gt; выделено ребро (6, 2)&amp;lt;br&amp;gt;&amp;lt;font color=#22B14C&amp;gt;Зеленым&amp;lt;/font&amp;gt; обозначена петля (6, 6)]]&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Ребром''' ориентированного графа называют упорядоченную пару вершин &amp;lt;tex&amp;gt; (v, u) \in E &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
В графе ребро, концы которого совпадают, то есть &amp;lt;tex&amp;gt;e=(v,v)&amp;lt;/tex&amp;gt;, называется &amp;lt;b&amp;gt;петлей&amp;lt;/b&amp;gt;. Мультиграф с петлями принято называть '''псевдографом'''.&lt;br /&gt;
[[Файл: Multigraph.png|thumb|300px|right|а) Мультиграф&amp;lt;br&amp;gt; б) Псевдограф]]&lt;br /&gt;
&lt;br /&gt;
Если имеется ребро &amp;lt;tex&amp;gt; (v, u) \in E &amp;lt;/tex&amp;gt;, то иногда говорят, что &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; - &amp;lt;b&amp;gt;предок&amp;lt;/b&amp;gt; &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;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;b&amp;gt;смежными&amp;lt;/b&amp;gt;. Граф с &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt; вершинами и &amp;lt;tex&amp;gt; q &amp;lt;/tex&amp;gt; ребрами называют &amp;lt;tex&amp;gt; (p, q) &amp;lt;/tex&amp;gt; - графом.  &amp;lt;tex&amp;gt; (1, 0) &amp;lt;/tex&amp;gt;  - граф называют &amp;lt;b&amp;gt;тривиальным&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же для ориентированных графов определяют '''полустепень входа вершины'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;deg^-v_i = |\{e~|beg~e = v\}|&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;deg^+v_i = |\{e~|end~e = v\}|&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как у каждого ребра ровно одно начало и ровно один конец выполнено следующее равенство:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{v\in V(G)}deg^-v_i = \sum\limits_{v\in V(G)}deg^+v_i = |E|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Путём''' в графе называется последовательность вида &amp;lt;tex&amp;gt;v_0 e_1 v_1 ... e_k v_k&amp;lt;/tex&amp;gt;,  где &amp;lt;tex&amp;gt;e_i = (v_{i-1}, v_i)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Циклическим путём''' называется путь, в котором &amp;lt;tex&amp;gt;v_0 = v_k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Цикл''' - это класс эквивалентности циклических путей на отношении эквивалентности таком, что два пути эквивалентны, если &amp;lt;tex&amp;gt; \exists  j : \forall i \Rightarrow e_{(i \mod k)} = e'_{(i + j) \mod k}&amp;lt;/tex&amp;gt;; где &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; - это две последовательности ребер в циклическом пути.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Неориентированные графы==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Неориентированным графом''' (undirected graph) &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; называется пара &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; - конечное множество вершин, а &amp;lt;tex&amp;gt; E \subset V \times V(uv ~ vu \{uu~|~u \in V\})&amp;lt;/tex&amp;gt; - множество рёбер.&lt;br /&gt;
}}&lt;br /&gt;
[[Файл: Неорграф.png|thumb|300px|right|Неориентированный граф&amp;lt;br&amp;gt;]]&lt;br /&gt;
Иное определение:&lt;br /&gt;
&lt;br /&gt;
'''Неориентированным графом''' &amp;lt;tex&amp;gt;G = (V, E, ends)&amp;lt;/tex&amp;gt; , где &amp;lt;tex&amp;gt;ends : E \rightarrow V \times 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; - некоторые абстрактные множества. &lt;br /&gt;
&lt;br /&gt;
'''Ребром''' в неориентированном графе называют неупорядоченную пару вершин &amp;lt;tex&amp;gt; (v, u) \in E &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Две вершины называются '''смежными''' если между ними есть ребро.&lt;br /&gt;
&lt;br /&gt;
'''Степеню''' вершины &amp;lt;tex&amp;gt;deg~v_i&amp;lt;/tex&amp;gt; в неориентированном называют число ребер, инцидентных &amp;lt;tex&amp;gt;v_i&amp;lt;/tex&amp;gt;. Будем считать, что петли добавляют к степени вершины &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Циклическим путём''' называется путь, в котором &amp;lt;tex&amp;gt;v_0 = v_k&amp;lt;/tex&amp;gt;, а так же &amp;lt;tex&amp;gt; e_i \ne e_{(i+1) \mod k}&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;
'''Ребро(edge) - Дуга(arc) - Линия(line)'''&lt;br /&gt;
&lt;br /&gt;
'''Вершина(vertex) - Узел(node) - Точка(point)'''&lt;br /&gt;
&lt;br /&gt;
'''Путь - Маршрут'''&lt;br /&gt;
&lt;br /&gt;
etc..&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;
* Харари Фрэнк '''Теория графов''' = Graph theory/Пер. с англ. и предисл. В. П. Козырева. Под ред. Г.П.Гаврилова. Изд. 2-е. — М.: Едиториал УРСС, 2003. — 296 с. — ISBN 5-354-00301-6&lt;br /&gt;
* Асанов М. О., Баранский В. А., Расин В. В. '''Дискретная математика: графы, матроиды, алгоритмы''' — НИЦ РХД, 2001. — 288 с. — ISBN 5-93972-076-5&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;br /&gt;
[[Категория: Основные определения теории графов]]&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D0%B8_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=12085</id>
		<title>Основные определения теории графов</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D1%82%D0%B5%D0%BE%D1%80%D0%B8%D0%B8_%D0%B3%D1%80%D0%B0%D1%84%D0%BE%D0%B2&amp;diff=12085"/>
				<updated>2011-10-26T18:34:19Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: /* Ориентированные графы */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Ориентированные графы==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Ориентированным графом''' (directed graph) &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; называется пара &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; - конечное множество вершин, а &amp;lt;tex&amp;gt; E \subset V \times V &amp;lt;/tex&amp;gt; - множество рёбер.&lt;br /&gt;
}}&lt;br /&gt;
[[Файл: directed_graph.png|thumb|300px|right|Ориентированный граф&amp;lt;br&amp;gt;&amp;lt;font color=#ED1C24&amp;gt;Красным&amp;lt;/font&amp;gt; выделено ребро (6, 2)&amp;lt;br&amp;gt;&amp;lt;font color=#22B14C&amp;gt;Зеленым&amp;lt;/font&amp;gt; обозначена петля (6, 6)]]&lt;br /&gt;
&lt;br /&gt;
Заметим, что по такому определению любые две вершины &amp;lt;tex&amp;gt;u,~v&amp;lt;/tex&amp;gt; нельзя соединить более чем одним ребром &amp;lt;tex&amp;gt;(u, v)&amp;lt;/tex&amp;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, E, beg, end)&amp;lt;/tex&amp;gt; , где &amp;lt;tex&amp;gt;beg, end : E \rightarrow 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; - некоторые абстрактные множества. Иногда граф, построенный таким образом называют '''мультиграфом'''. В мультиграфе не допускаются петли (см. определение ниже), но пары вершин допускается соединять более чем одним ребром. Такие ребра называются '''кратными''' (иначе - '''параллельные''').&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Ребром''' ориентированного графа называют упорядоченную пару вершин &amp;lt;tex&amp;gt; (v, u) \in E &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
[[Файл: Multigraph.png|thumb|300px|right|а) Мультиграф&amp;lt;br&amp;gt; б) Псевдограф]]&lt;br /&gt;
&lt;br /&gt;
В графе ребро, концы которого совпадают, то есть &amp;lt;tex&amp;gt;e=(v,v)&amp;lt;/tex&amp;gt;, называется &amp;lt;b&amp;gt;петлей&amp;lt;/b&amp;gt;. Мультиграф с петлями принято называть '''псевдографом'''.&lt;br /&gt;
&lt;br /&gt;
Если имеется ребро &amp;lt;tex&amp;gt; (v, u) \in E &amp;lt;/tex&amp;gt;, то иногда говорят, что &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; - &amp;lt;b&amp;gt;предок&amp;lt;/b&amp;gt; &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;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;b&amp;gt;смежными&amp;lt;/b&amp;gt;. Граф с &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt; вершинами и &amp;lt;tex&amp;gt; q &amp;lt;/tex&amp;gt; ребрами называют &amp;lt;tex&amp;gt; (p, q) &amp;lt;/tex&amp;gt; - графом.  &amp;lt;tex&amp;gt; (1, 0) &amp;lt;/tex&amp;gt;  - граф называют &amp;lt;b&amp;gt;тривиальным&amp;lt;/b&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так же для ориентированных графов определяют '''полустепень входа вершины'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;deg^-v_i = |\{e~|beg~e = v\}|&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;deg^+v_i = |\{e~|end~e = v\}|&amp;lt;/tex&amp;gt;.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Так как у каждого ребра ровно одно начало и ровно один конец выполнено следующее равенство:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\sum\limits_{v\in V(G)}deg^-v_i = \sum\limits_{v\in V(G)}deg^+v_i = |E|&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Путём''' в графе называется последовательность вида &amp;lt;tex&amp;gt;v_0 e_1 v_1 ... e_k v_k&amp;lt;/tex&amp;gt;,  где &amp;lt;tex&amp;gt;e_i = (v_{i-1}, v_i)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Циклическим путём''' называется путь, в котором &amp;lt;tex&amp;gt;v_0 = v_k&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Цикл''' - это класс эквивалентности циклических путей на отношении эквивалентности таком, что два пути эквивалентны, если &amp;lt;tex&amp;gt; \exists  j : \forall i \Rightarrow e_{(i \mod k)} = e'_{(i + j) \mod k}&amp;lt;/tex&amp;gt;; где &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; - это две последовательности ребер в циклическом пути.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Неориентированные графы==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Неориентированным графом''' (undirected graph) &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; называется пара &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; - конечное множество вершин, а &amp;lt;tex&amp;gt; E \subset V \times V(uv ~ vu \{uu~|~u \in V\})&amp;lt;/tex&amp;gt; - множество рёбер.&lt;br /&gt;
}}&lt;br /&gt;
[[Файл: Неорграф.png|thumb|300px|right|Неориентированный граф&amp;lt;br&amp;gt;]]&lt;br /&gt;
Иное определение:&lt;br /&gt;
&lt;br /&gt;
'''Неориентированным графом''' &amp;lt;tex&amp;gt;G = (V, E, ends)&amp;lt;/tex&amp;gt; , где &amp;lt;tex&amp;gt;ends : E \rightarrow V \times 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; - некоторые абстрактные множества. &lt;br /&gt;
&lt;br /&gt;
'''Ребром''' в неориентированном графе называют неупорядоченную пару вершин &amp;lt;tex&amp;gt; (v, u) \in E &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Две вершины называются '''смежными''' если между ними есть ребро.&lt;br /&gt;
&lt;br /&gt;
'''Степеню''' вершины &amp;lt;tex&amp;gt;deg~v_i&amp;lt;/tex&amp;gt; в неориентированном называют число ребер, инцидентных &amp;lt;tex&amp;gt;v_i&amp;lt;/tex&amp;gt;. Будем считать, что петли добавляют к степени вершины &amp;lt;tex&amp;gt;2&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Циклическим путём''' называется путь, в котором &amp;lt;tex&amp;gt;v_0 = v_k&amp;lt;/tex&amp;gt;, а так же &amp;lt;tex&amp;gt; e_i \ne e_{(i+1) \mod k}&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;
'''Ребро(edge) - Дуга(arc) - Линия(line)'''&lt;br /&gt;
&lt;br /&gt;
'''Вершина(vertex) - Узел(node) - Точка(point)'''&lt;br /&gt;
&lt;br /&gt;
'''Путь - Маршрут'''&lt;br /&gt;
&lt;br /&gt;
etc..&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;
* Харари Фрэнк '''Теория графов''' = Graph theory/Пер. с англ. и предисл. В. П. Козырева. Под ред. Г.П.Гаврилова. Изд. 2-е. — М.: Едиториал УРСС, 2003. — 296 с. — ISBN 5-354-00301-6&lt;br /&gt;
* Асанов М. О., Баранский В. А., Расин В. В. '''Дискретная математика: графы, матроиды, алгоритмы''' — НИЦ РХД, 2001. — 288 с. — ISBN 5-93972-076-5&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;br /&gt;
[[Категория: Основные определения теории графов]]&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D1%82%D0%BD%D0%BE%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D1%81%D1%82%D0%B8,_%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82%D1%8B_%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D1%81%D1%82%D0%B8&amp;diff=12070</id>
		<title>Отношение связности, компоненты связности</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D1%82%D0%BD%D0%BE%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D1%81%D1%82%D0%B8,_%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82%D1%8B_%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D1%81%D1%82%D0%B8&amp;diff=12070"/>
				<updated>2011-10-26T18:06:58Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: /* Случай неориентированного графа */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Случай неориентированного графа ==&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&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;G&amp;lt;/tex&amp;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;u \rightsquigarrow v &amp;lt;/tex&amp;gt;).}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Связность - '''отношение эквивалентности'''.&lt;br /&gt;
|proof=&lt;br /&gt;
'''Рефлексивность''': &amp;lt;tex&amp;gt;\forall a \in V a \rightsquigarrow a&amp;lt;/tex&amp;gt; (очевидно).&lt;br /&gt;
&lt;br /&gt;
'''Симметричность''': &amp;lt;tex&amp;gt;a\rightsquigarrow b \Rightarrow b\rightsquigarrow a&amp;lt;/tex&amp;gt; (в силу неориентированности графа).&lt;br /&gt;
&lt;br /&gt;
'''Транзитивность''': &amp;lt;tex&amp;gt;a\rightsquigarrow b \land b\rightsquigarrow c \Rightarrow a\rightsquigarrow c&amp;lt;/tex&amp;gt;. Действительно, сначала пройдем от &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;, затем от &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt;, что и означает существования пути  &amp;lt;tex&amp;gt;a \rightsquigarrow b&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Компонентой связности''' называется класс эквивалентности относительно связности.}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Граф &amp;lt;tex&amp;gt;G=(V, E)&amp;lt;/tex&amp;gt; называется '''связным''', если он состоит из одной компоненты связности. В противном случае граф называется '''несвязным'''.}}&lt;br /&gt;
&lt;br /&gt;
== Случай ориентированного графа ==&lt;br /&gt;
В общем случае для ориентированного графа существование пути — не симметричное отношение, поэтому вместо понятия связности различают понятие слабой и сильной связности.&lt;br /&gt;
=== Слабая связность ===&lt;br /&gt;
&amp;lt;wikitex&amp;gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Отношение $R(v, u)$ называется отношением '''слабой связности''', если вершины $u$ и $v$ связаны в неориентированном графе $G'$, полученном из графа $G$ удалением с ребер ориентации.&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;
[[Файл:Слаб.jpg|frame|слева|Слабосвязный граф. Компоненты слабой связности выделены красным.]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/wikitex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Сильная связность ===&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Отношение &amp;lt;tex&amp;gt;R(v, u) = v \rightsquigarrow u \land  u \rightsquigarrow v&amp;lt;/tex&amp;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;
&amp;lt;tex&amp;gt;(a\rightsquigarrow b \land b\rightsquigarrow a) \land  (b\rightsquigarrow c \land c\rightsquigarrow b)\Leftrightarrow (a\rightsquigarrow b \land b\rightsquigarrow c) \land (c\rightsquigarrow b \land b\rightsquigarrow a) \Leftrightarrow a\rightsquigarrow c \land c\rightsquigarrow a&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt; — ориентированный граф. '''Компонентой сильной связности''' называется класс эквивалентности множества вершин этого графа относительно сильной связности.}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Ориентированный граф &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt; называется '''сильно связным''', если он состоит из одной компоненты сильной связности.}}&lt;br /&gt;
&lt;br /&gt;
[[Файл:Сил.jpg|слева|frame|Сильносвязный граф. Компоненты сильной связности выделены красным.]]&lt;br /&gt;
&amp;lt;br clear=&amp;quot;all&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* [http://xn--90abr5b.xn--p1ai/wiki/doku.php?id=examination:diskretka:question12 ivtb.ru]&lt;br /&gt;
* Харари Фрэнк '''Теория графов''': Пер. с англ./ Предисл. В. П. Козырева; Под ред. Г.П.Гаврилова. Изд. 4-е. — М.: Книжный дом &amp;quot;ЛИБРОКОМ&amp;quot;, 2009. — 296 с. — ISBN 978-5-397-00622-4.&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Основные определения теории графов ]]&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D1%82%D0%BD%D0%BE%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D1%81%D1%82%D0%B8,_%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82%D1%8B_%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D1%81%D1%82%D0%B8&amp;diff=11778</id>
		<title>Отношение связности, компоненты связности</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D1%82%D0%BD%D0%BE%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D1%81%D1%82%D0%B8,_%D0%BA%D0%BE%D0%BC%D0%BF%D0%BE%D0%BD%D0%B5%D0%BD%D1%82%D1%8B_%D1%81%D0%B2%D1%8F%D0%B7%D0%BD%D0%BE%D1%81%D1%82%D0%B8&amp;diff=11778"/>
				<updated>2011-10-22T17:37:34Z</updated>
		
		<summary type="html">&lt;p&gt;Chuprikov Pavel: /* Слабая связность */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Случай неориентированного графа ==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&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;G&amp;lt;/tex&amp;gt; существует путь из &amp;lt;tex&amp;gt;u&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;
|statement=&lt;br /&gt;
Связность - '''отношение эквивалентности'''.&lt;br /&gt;
|proof=&lt;br /&gt;
'''Рефлексивность''': &amp;lt;tex&amp;gt;\forall a \in V a \rightsquigarrow a&amp;lt;/tex&amp;gt; (очевидно).&lt;br /&gt;
&lt;br /&gt;
'''Симметричность''': &amp;lt;tex&amp;gt;a\rightsquigarrow b \Rightarrow b\rightsquigarrow a&amp;lt;/tex&amp;gt; (в силу неориентированности графа).&lt;br /&gt;
&lt;br /&gt;
'''Транзитивность''': &amp;lt;tex&amp;gt;a\rightsquigarrow b \land b\rightsquigarrow c \Rightarrow a\rightsquigarrow c&amp;lt;/tex&amp;gt;. Действительно, сначала пройдем от &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;, затем от &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt;c&amp;lt;/tex&amp;gt;, что и означает существования пути  &amp;lt;tex&amp;gt;a \rightsquigarrow b&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
'''Компонентой связности''' называется класс эквивалентности относительно связности.}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Граф &amp;lt;tex&amp;gt;G=(V, E)&amp;lt;/tex&amp;gt; называется '''связным''', если он состоит из одной компоненты связности. В противном случае граф называется '''несвязным'''.}}&lt;br /&gt;
&lt;br /&gt;
== Случай ориентированного графа ==&lt;br /&gt;
В общем случае для ориентированного графа существование пути — не симметричное отношение, поэтому вместо понятия связности различают понятие слабой и сильной связности.&lt;br /&gt;
=== Слабая связность ===&lt;br /&gt;
&amp;lt;wikitex&amp;gt;{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Отношение $R(v, u)$ называется отношением '''слабой связности''', если вершины $u$ и $v$ связаны в неориентированном графе $G'$, полученном из графа $G$ удалением с ребер ориентации.&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;
&amp;lt;/wikitex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Сильная связность ===&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Отношение &amp;lt;tex&amp;gt;R(v, u) = v \rightsquigarrow u \land  u \rightsquigarrow v&amp;lt;/tex&amp;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;
&amp;lt;tex&amp;gt;(a\rightsquigarrow b \land b\rightsquigarrow a) \land  (b\rightsquigarrow c \land c\rightsquigarrow b)\Leftrightarrow (a\rightsquigarrow b \land b\rightsquigarrow c) \land (c\rightsquigarrow b \land b\rightsquigarrow a) \Leftrightarrow a\rightsquigarrow c \land c\rightsquigarrow a&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt; — ориентированный граф. '''Компонентой сильной связности''' называется класс эквивалентности множества вершин этого графа относительно сильной связности.}}&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=&lt;br /&gt;
Ориентированный граф &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt; называется '''сильно связным''', если он состоит из одной компоненты сильной связности.}}&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
* [http://xn--90abr5b.xn--p1ai/wiki/doku.php?id=examination:diskretka:question12 ivtb.ru]&lt;br /&gt;
* Ф. Харари, &amp;quot;Теория графов&amp;quot;, изд.&amp;quot;МОСКВА&amp;quot;, 2009 год.&lt;/div&gt;</summary>
		<author><name>Chuprikov Pavel</name></author>	</entry>

	</feed>