<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=178.70.145.12&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=178.70.145.12&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/178.70.145.12"/>
		<updated>2026-06-12T07:18:57Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%93%D0%B0%D0%BC%D0%B8%D0%BB%D1%8C%D1%82%D0%BE%D0%BD%D0%BE%D0%B2%D1%8B_%D0%B3%D1%80%D0%B0%D1%84%D1%8B&amp;diff=40098</id>
		<title>Гамильтоновы графы</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%93%D0%B0%D0%BC%D0%B8%D0%BB%D1%8C%D1%82%D0%BE%D0%BD%D0%BE%D0%B2%D1%8B_%D0%B3%D1%80%D0%B0%D1%84%D1%8B&amp;diff=40098"/>
				<updated>2014-09-28T08:47:05Z</updated>
		
		<summary type="html">&lt;p&gt;178.70.145.12: Добавлен перевод&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Hamiltonial.png|300px|thumb|right|Граф додекаэдра с выделенным циклом Гамильтона]]&lt;br /&gt;
==Основные определения==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Гамильтоновым путём''' (англ. ''Hamiltonian path'') называется простой путь, приходящий через каждую вершину графа ровно один раз.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
'''Гамильтоновым циклом''' (англ. ''Hamiltonian cycle'') называют замкнутый гамильтонов путь.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
Граф называется '''полугамильтоновым''' (англ. ''Semihamiltonian graph''), если он содержит гамильтонов путь.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition =&lt;br /&gt;
Граф называется '''гамильтоновым''' (англ. ''Hamiltonian graph''), если он содержит гамильтонов цикл. &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;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;n \ge 3&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;deg\ v \ge n/2&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;G&amp;lt;/tex&amp;gt; - гамильтонов граф.&lt;br /&gt;
}}&lt;br /&gt;
===[[Теорема Оре|Теорема Оре]]===&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Если &amp;lt;tex&amp;gt;n \ge  3&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;deg\ u + deg\ v \ge n&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;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;
|statement=&lt;br /&gt;
Любой сильносвязный [[Турниры|турнир]] - гамильтонов.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===Теорема Гуйя-Ури===&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|about=&lt;br /&gt;
Ghouila-Houri&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть G - сильносвязный ориентированный граф. &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
\begin{matrix}&lt;br /&gt;
    deg^+ v \geq n/2 \\&lt;br /&gt;
    deg^- v \geq n/2 \\&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
\end{matrix} \Bigg\} \rightarrow &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/tex&amp;gt; G - гамильтонов.&lt;br /&gt;
}}&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;
* &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; — [[Отношение связности, компоненты связности|связный граф]],&lt;br /&gt;
* &amp;lt;tex&amp;gt; n = |VG| \geq 3 &amp;lt;/tex&amp;gt; — количество вершин,&lt;br /&gt;
* &amp;lt;tex&amp;gt; d_1 \leq d_2 \leq \ldots \leq d_n &amp;lt;/tex&amp;gt; — его последовательность степеней.&lt;br /&gt;
Тогда если &amp;lt;tex&amp;gt; \forall k \in \mathbb N &amp;lt;/tex&amp;gt; верна импликация: &amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt; d_k \leq k &amp;lt; n/2 \Rightarrow d_{n - k} \geq n - k, (*) &amp;lt;/tex&amp;gt;&amp;lt;/center&amp;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;
|statement=&lt;br /&gt;
Пусть граф G имеет &amp;lt;tex&amp;gt;n \geq 3&amp;lt;/tex&amp;gt; вершин. Если для всякого &amp;lt;tex&amp;gt;k,\, 1 \leq k &amp;lt; (n-1)/2&amp;lt;/tex&amp;gt; число вершин со степенями, не превосходящими &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, меньше чем &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt;, и для нечетного &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; число вершин степени &amp;lt;tex&amp;gt;(n-1)/2&amp;lt;/tex&amp;gt; не превосходит &amp;lt;tex&amp;gt;(n-1)/2&amp;lt;/tex&amp;gt;, то G - гамильтонов граф.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Алгоритм нахождения гамильтового цикла==&lt;br /&gt;
&lt;br /&gt;
Приведём два алгоритма поиска гамильтонова цикла.&lt;br /&gt;
&lt;br /&gt;
 bool check_hamiltonian(graph g, bool[] used, int vert, int count, int[] next):&lt;br /&gt;
   if (count == g.vertices):&lt;br /&gt;
     next[vert] = 0&lt;br /&gt;
     return (vert; 0) in g.edges&lt;br /&gt;
   for (i = 0; i &amp;lt; g.vertices; i++):&lt;br /&gt;
     if (!used[i] &amp;amp;&amp;amp; (vert; i) in g.edges):&lt;br /&gt;
       used[i] = true&lt;br /&gt;
       next[vert] = i&lt;br /&gt;
       if (check_hamiltonian(g, used, i, count + 1, next)):&lt;br /&gt;
         return true&lt;br /&gt;
       used[i] = false&lt;br /&gt;
   return false&lt;br /&gt;
&lt;br /&gt;
* used — отметки о посещении&lt;br /&gt;
* vert — текущая вершина&lt;br /&gt;
* count — количество посещённых вершин &lt;br /&gt;
&lt;br /&gt;
Приведённая процедура работает следующим образом: перебираются всё рёбра из текущей вершины в ещё не посещённые. Чтобы проверить граф на гамильтоновость, необходимо запустить процедуру из вершины с номером 0 и параметром count = 1. Если процедура возвращает true, то в массиве next будет храниться следующая вершина на гамильтоновом цикле. Этот алгоритм в худшем случае перебирает &amp;lt;tex&amp;gt;(n - 1)!&amp;lt;/tex&amp;gt; путей, что даёт сложность работы &amp;lt;tex&amp;gt;O(n!)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Приведём алгоритм, основанный на динамическом программировании, который работает значительно быстрее. Алгоритм основан на следующей идее: будем для каждой пары из подмножества вершин и вершины считать, существует ли гамильтонов путь для этого подмножества вершин, заканчивающихся в выделенной вершине. Суммарно таких состояний будет &amp;lt;tex&amp;gt;O(n2^n)&amp;lt;/tex&amp;gt;, для обсчёта каждого из них требуется &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; времени, то есть, суммарно алгоритм работает за &amp;lt;tex&amp;gt;O(n^22^n)&amp;lt;/tex&amp;gt; времени. Псевдокод, реализующий этот алгоритм, приведён ниже:&lt;br /&gt;
&lt;br /&gt;
 bool[][] get_dp_table(graph g):&lt;br /&gt;
   int n = g.vertices&lt;br /&gt;
   bool[][] result = new int[1 &amp;lt;&amp;lt; n][n];&lt;br /&gt;
   for (int i = 0; i &amp;lt; n; i++):&lt;br /&gt;
     result[1 &amp;lt;&amp;lt; i][i] = (0; i) in g.edges;&lt;br /&gt;
   for (int i = 1; i &amp;lt; (1 &amp;lt;&amp;lt; n); i++):&lt;br /&gt;
     if (count(i) == 1):&lt;br /&gt;
       continue&lt;br /&gt;
     for (int j = 0; j &amp;lt; n; j++):&lt;br /&gt;
       if ((1 &amp;lt;&amp;lt; j) &amp;amp; i != 0):&lt;br /&gt;
         for (int k = 0; k &amp;lt; n; k++):&lt;br /&gt;
           if (k != j &amp;amp;&amp;amp; (1 &amp;lt;&amp;lt; k) &amp;amp; i != 0):&lt;br /&gt;
             result[i][j] = result[(1 &amp;lt;&amp;lt; j) ^ i][k] &amp;amp;&amp;amp; (k; j) in g.edges&lt;br /&gt;
   return result&lt;br /&gt;
&lt;br /&gt;
В приведённом выше коде считаем, что n меньше количества бит в числовом типе данных, для операций над множествами используются побитовые логические операции в синтаксисе языка C. Функция count считает количество единичных бит в числе (она проста в реализации, но не относится к алгоритма, поэтому не приводится). Граф гамильтонов тогда, когда dp[(1 &amp;lt;&amp;lt; n) - 1][i] &amp;amp;&amp;amp; (i; 0) &amp;lt;tex&amp;gt;\in&amp;lt;/tex&amp;gt; g.edges для некоторого i.&lt;br /&gt;
&lt;br /&gt;
==Источники==&lt;br /&gt;
*Харари Ф. Теория графов: Пер. с англ. / Предисл. В. П. Козырева; Под ред. Г.П.Гаврилова. Изд. 4-е. — М.: Книжный дом &amp;quot;ЛИБРОКОМ&amp;quot;, 2009. — 60 с.&lt;br /&gt;
*Седжвик Р. Фундаментальные алгоритмы на C++. Алгоритмы на графах. — СПб: ООО «ДиаСофтЮП», 2002.&lt;br /&gt;
*[http://ru.wikipedia.org/wiki/Гамильтонов_граф Гамильтонов граф]&lt;br /&gt;
&lt;br /&gt;
[[Категория:Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Обходы графов]]&lt;/div&gt;</summary>
		<author><name>178.70.145.12</name></author>	</entry>

	</feed>