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

	<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%BD%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F_%D0%93%D0%B0%D0%BC%D0%B8%D0%BB%D1%8C%D1%82%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0_%D1%86%D0%B8%D0%BA%D0%BB%D0%B0_%D0%B2_%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%B8%D1%8F%D1%85_%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC_%D0%94%D0%B8%D1%80%D0%B0%D0%BA%D0%B0_%D0%B8_%D0%9E%D1%80%D0%B5&amp;diff=33934</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%BD%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F_%D0%93%D0%B0%D0%BC%D0%B8%D0%BB%D1%8C%D1%82%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0_%D1%86%D0%B8%D0%BA%D0%BB%D0%B0_%D0%B2_%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%B8%D1%8F%D1%85_%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC_%D0%94%D0%B8%D1%80%D0%B0%D0%BA%D0%B0_%D0%B8_%D0%9E%D1%80%D0%B5&amp;diff=33934"/>
				<updated>2013-12-06T18:08:36Z</updated>
		
		<summary type="html">&lt;p&gt;188.162.64.100: /* Описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть у нас есть граф &amp;lt;tex&amp;gt;\mathbb{G} = \left \langle \mathbb{V, E} \right \rangle&amp;lt;/tex&amp;gt;, удовлетворяющий условию [[Теорема Дирака|теоремы Оре]] или [[Теорема Дирака|теоремы Дирака]], и требуется найти в нем гамильтонов цикл. Поступим следующим образом: заведем очередь и положим в нее все вершины нашего графа(не важно в каком порядке). Теперь &amp;lt;tex&amp;gt;n = \left | \mathbb{V}\right |&amp;lt;/tex&amp;gt; раз будем делать следующую операцию:&lt;br /&gt;
&lt;br /&gt;
* Если между первой (здесь и далее первая вершина - вершина в голове очереди) и второй вершиной в очереди есть ребро в графе &amp;lt;tex&amp;gt;\mathbb{G}&amp;lt;/tex&amp;gt;, то перемещаем первую вершину в конец очереди и переходим к следующей итерации.&lt;br /&gt;
* Если между первой и второй вершиной в очереди ребра нет, то найдем вершину &amp;lt;tex&amp;gt;v_i&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;i &amp;gt; 2&amp;lt;/tex&amp;gt;, такую что, ребра &amp;lt;tex&amp;gt;v_1v_i, v_2v_{i+1} \in \mathbb{E}&amp;lt;/tex&amp;gt; (так как у нас для графа выполнена либо [[Теорема Оре|теорема Оре]], либо [[Теорема Дирака|теорема Дирака]], то такая вершина обязательно найдется; чуть позже мы это докажем явно). После чего поменяем в очереди местами вершины &amp;lt;tex&amp;gt;v_2&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v_i&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;v_3&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v_{i-1}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;v_{2+j} &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v_{i-j}&amp;lt;/tex&amp;gt;, и так далее, пока &amp;lt;tex&amp;gt;2 + j &amp;lt; i - j&amp;lt;/tex&amp;gt; (то есть &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; пробегает все значения от 0 до значения заданного неравенством). Теперь у нас появилось ребро между первой и второй вершинами в очереди (теперь вторая вершина, это та, которая была до разворота на &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;(i+1)&amp;lt;/tex&amp;gt;-й вершинами очереди. После этого, так же как и в первом случае, оправляем первую вершину в конец очереди.&lt;br /&gt;
&lt;br /&gt;
Таким образом после &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; итераций, мы получаем последовательность (вершины лежащие в очереди), где любые 2 соседние вершины соединены ребром, все вершины графа находятся в этой последовательности, и более того, каждая ровно один раз, а также существует ребро между последней и первой вершинами очереди, а это и значит, что мы решили поставленную задачу.&lt;br /&gt;
&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
{| width = 100%&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
  Queue queue;                              // создаем очередь&lt;br /&gt;
  for i = 0 to n - 1                        // &lt;br /&gt;
    queue.pushback(v[i])                    // добавляем в очередь все вершины графа&lt;br /&gt;
  for k = 0 to n - 1                        // пока не проделано нужное количество итераций&lt;br /&gt;
    if !exist(queue.at(0), queue.at(1))     // проверяем существования ребра между первой и второй вершинами очереди&lt;br /&gt;
      queue.swapSubQueue(2, find_vertex())  // если, не существует, то меняем порядок вершин в очереди, со второй до &lt;br /&gt;
                                            // найденной, удовлетворяющей нас позиции&lt;br /&gt;
  &lt;br /&gt;
|width = &amp;quot;310px&amp;quot; |&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Доказательство алгоритма ==&lt;br /&gt;
Для доказательства корректности алгоритма достаточно показать:&lt;br /&gt;
&lt;br /&gt;
* Каждый раз, когда нам надо искать вершину &amp;lt;tex&amp;gt;v_i&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;i &amp;gt; 2&amp;lt;/tex&amp;gt;, такую что &amp;lt;tex&amp;gt;v_1v_i, v_2v_{i+1} \in \mathbb{E}&amp;lt;/tex&amp;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;S = \{i\mid v_1v_i \in \mathbb{E}\}&amp;lt;/tex&amp;gt;, состоящее из вершин, смежных с &amp;lt;tex&amp;gt;v_1&amp;lt;/tex&amp;gt;, и множество &amp;lt;tex&amp;gt;T = \{i+1 \mid v_2v_{i+1} \in \mathbb{E}\}&amp;lt;/tex&amp;gt;, вершин смежных с &amp;lt;tex&amp;gt;v_2&amp;lt;/tex&amp;gt;. Заметим, что &amp;lt;tex&amp;gt;S \subset \{3, 4,...,n\}&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;T \subset \{2, 3,...,n - 1\}&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;S\cup T\subset \{2, 3,...,n\} &amp;lt;/tex&amp;gt;, а значит &amp;lt;tex&amp;gt;\left\vert S\cup T\right\vert \le n-1&amp;lt;/tex&amp;gt;, в то же время &amp;lt;tex&amp;gt;\left\vert S \right\vert + \left\vert T \right\vert = \operatorname{deg} v_1 + \operatorname{deg} v_2 \ge n&amp;lt;/tex&amp;gt; (по условию [[Теорема Оре|теоремы Оре]] или [[Теорема Дирака|теоремы Дирака]]). Из этого следует, что &amp;lt;tex&amp;gt;S\cap T\ne \varnothing&amp;lt;/tex&amp;gt;, а это и значит, что искомая вершина существует.&lt;br /&gt;
&lt;br /&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; увеличиваем количество пар соседних в очереди вершин, между которыми есть ребро, как минимум на 1 (это прямое следствие условия поиска нужной вершины, в случае отсутствия ребра), а таких пар изначально не более &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;. Откуда следует, что после &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; итераций, второе условие будет выполнено.&lt;br /&gt;
&lt;br /&gt;
== Сложность алгоритма ==&lt;br /&gt;
Алгоритм работает за &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;. Действительно, количество итераций внешнего цикла &amp;lt;tex&amp;gt;\mathrm{for}&amp;lt;/tex&amp;gt; всегда равно &amp;lt;tex&amp;gt;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^2)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См.также ==&lt;br /&gt;
*[[Гамильтоновы графы]]&lt;br /&gt;
*[[Теорема Оре]]&lt;br /&gt;
*[[теорема Дирака|Теорема Дирака]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Обходы графов]]&lt;/div&gt;</summary>
		<author><name>188.162.64.100</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%BD%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F_%D0%93%D0%B0%D0%BC%D0%B8%D0%BB%D1%8C%D1%82%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0_%D1%86%D0%B8%D0%BA%D0%BB%D0%B0_%D0%B2_%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%B8%D1%8F%D1%85_%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC_%D0%94%D0%B8%D1%80%D0%B0%D0%BA%D0%B0_%D0%B8_%D0%9E%D1%80%D0%B5&amp;diff=33933</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%BD%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F_%D0%93%D0%B0%D0%BC%D0%B8%D0%BB%D1%8C%D1%82%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0_%D1%86%D0%B8%D0%BA%D0%BB%D0%B0_%D0%B2_%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%B8%D1%8F%D1%85_%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC_%D0%94%D0%B8%D1%80%D0%B0%D0%BA%D0%B0_%D0%B8_%D0%9E%D1%80%D0%B5&amp;diff=33933"/>
				<updated>2013-12-06T18:08:03Z</updated>
		
		<summary type="html">&lt;p&gt;188.162.64.100: /* Доказательство алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть у нас есть граф &amp;lt;tex&amp;gt;\mathbb{G} = \left \langle \mathbb{V, E} \right \rangle&amp;lt;/tex&amp;gt;, удовлетворяющий условию [[Теорема Дирака|теоремы Оре]] или [[Теорема Дирака|теоремы Дирака]], и требуется найти в нем гамильтонов цикл. Поступим следующим образом: заведем очередь и положим в нее все вершины нашего графа(не важно в каком порядке). Теперь &amp;lt;tex&amp;gt;n = \left | \mathbb{V}\right |&amp;lt;/tex&amp;gt; раз будем делать следующую операцию:&lt;br /&gt;
&lt;br /&gt;
* Если между первой (здесь и далее первая вершина - вершина в голове очереди) и второй вершиной в очереди есть ребро в графе &amp;lt;tex&amp;gt;\mathbb{G}&amp;lt;/tex&amp;gt;, то перемещаем первую вершину в конец очереди и переходим к следующей итерации.&lt;br /&gt;
* Если между первой и второй вершиной в очереди ребра нет, то найдем вершину &amp;lt;tex&amp;gt;v_i&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;i &amp;gt; 2&amp;lt;/tex&amp;gt;, такую что, ребра &amp;lt;tex&amp;gt;v_1v_i, v_2v_{i+1} \in \mathbb{E}&amp;lt;/tex&amp;gt; (так как у нас для графа выполнена либо [[Теорема Оре|теорема Оре]], либо [[Теорема Дирака|теорема Дирака]], то такая вершина обязательно найдется; чуть позже мы это докажем явно). После чего поменяем в очереди местами вершины &amp;lt;tex&amp;gt;v_2&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v_i&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;v_3&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v_{i-1}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;v_{2+j} &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v_{i-j}&amp;lt;/tex&amp;gt;, и так далее, пока &amp;lt;tex&amp;gt;2 + j &amp;lt; i - j&amp;lt;/tex&amp;gt; (то есть &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; пробегает все значения от 0 до значения заданного неравенством). Теперь у нас появилось ребро между первой и второй вершинами в очереди (теперь вторая вершина, это та, которая была до разворота на &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;(i+1)&amp;lt;/tex&amp;gt;-й вершинами очереди. После этого, так же как и в первом случае, оправляем первую вершину в конец очереди.&lt;br /&gt;
&lt;br /&gt;
Таким образом после &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; итераций, мы получаем последовательность (вершины лежащие в очереди), где любые 2 соседние вершины соединены ребром, все вершины графа находятся в этой последовательности, и более того, каждая ровно один раз, а так же существует ребро между последней и первой вершинами очереди, а это и значит, что мы решили поставленную задачу.&lt;br /&gt;
&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
{| width = 100%&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
  Queue queue;                              // создаем очередь&lt;br /&gt;
  for i = 0 to n - 1                        // &lt;br /&gt;
    queue.pushback(v[i])                    // добавляем в очередь все вершины графа&lt;br /&gt;
  for k = 0 to n - 1                        // пока не проделано нужное количество итераций&lt;br /&gt;
    if !exist(queue.at(0), queue.at(1))     // проверяем существования ребра между первой и второй вершинами очереди&lt;br /&gt;
      queue.swapSubQueue(2, find_vertex())  // если, не существует, то меняем порядок вершин в очереди, со второй до &lt;br /&gt;
                                            // найденной, удовлетворяющей нас позиции&lt;br /&gt;
  &lt;br /&gt;
|width = &amp;quot;310px&amp;quot; |&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Доказательство алгоритма ==&lt;br /&gt;
Для доказательства корректности алгоритма достаточно показать:&lt;br /&gt;
&lt;br /&gt;
* Каждый раз, когда нам надо искать вершину &amp;lt;tex&amp;gt;v_i&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;i &amp;gt; 2&amp;lt;/tex&amp;gt;, такую что &amp;lt;tex&amp;gt;v_1v_i, v_2v_{i+1} \in \mathbb{E}&amp;lt;/tex&amp;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;S = \{i\mid v_1v_i \in \mathbb{E}\}&amp;lt;/tex&amp;gt;, состоящее из вершин, смежных с &amp;lt;tex&amp;gt;v_1&amp;lt;/tex&amp;gt;, и множество &amp;lt;tex&amp;gt;T = \{i+1 \mid v_2v_{i+1} \in \mathbb{E}\}&amp;lt;/tex&amp;gt;, вершин смежных с &amp;lt;tex&amp;gt;v_2&amp;lt;/tex&amp;gt;. Заметим, что &amp;lt;tex&amp;gt;S \subset \{3, 4,...,n\}&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;T \subset \{2, 3,...,n - 1\}&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;S\cup T\subset \{2, 3,...,n\} &amp;lt;/tex&amp;gt;, а значит &amp;lt;tex&amp;gt;\left\vert S\cup T\right\vert \le n-1&amp;lt;/tex&amp;gt;, в то же время &amp;lt;tex&amp;gt;\left\vert S \right\vert + \left\vert T \right\vert = \operatorname{deg} v_1 + \operatorname{deg} v_2 \ge n&amp;lt;/tex&amp;gt; (по условию [[Теорема Оре|теоремы Оре]] или [[Теорема Дирака|теоремы Дирака]]). Из этого следует, что &amp;lt;tex&amp;gt;S\cap T\ne \varnothing&amp;lt;/tex&amp;gt;, а это и значит, что искомая вершина существует.&lt;br /&gt;
&lt;br /&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; увеличиваем количество пар соседних в очереди вершин, между которыми есть ребро, как минимум на 1 (это прямое следствие условия поиска нужной вершины, в случае отсутствия ребра), а таких пар изначально не более &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;. Откуда следует, что после &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; итераций, второе условие будет выполнено.&lt;br /&gt;
&lt;br /&gt;
== Сложность алгоритма ==&lt;br /&gt;
Алгоритм работает за &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;. Действительно, количество итераций внешнего цикла &amp;lt;tex&amp;gt;\mathrm{for}&amp;lt;/tex&amp;gt; всегда равно &amp;lt;tex&amp;gt;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^2)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См.также ==&lt;br /&gt;
*[[Гамильтоновы графы]]&lt;br /&gt;
*[[Теорема Оре]]&lt;br /&gt;
*[[теорема Дирака|Теорема Дирака]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Обходы графов]]&lt;/div&gt;</summary>
		<author><name>188.162.64.100</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%BD%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F_%D0%93%D0%B0%D0%BC%D0%B8%D0%BB%D1%8C%D1%82%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0_%D1%86%D0%B8%D0%BA%D0%BB%D0%B0_%D0%B2_%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%B8%D1%8F%D1%85_%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC_%D0%94%D0%B8%D1%80%D0%B0%D0%BA%D0%B0_%D0%B8_%D0%9E%D1%80%D0%B5&amp;diff=33932</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%BD%D0%B0%D1%85%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F_%D0%93%D0%B0%D0%BC%D0%B8%D0%BB%D1%8C%D1%82%D0%BE%D0%BD%D0%BE%D0%B2%D0%B0_%D1%86%D0%B8%D0%BA%D0%BB%D0%B0_%D0%B2_%D1%83%D1%81%D0%BB%D0%BE%D0%B2%D0%B8%D1%8F%D1%85_%D1%82%D0%B5%D0%BE%D1%80%D0%B5%D0%BC_%D0%94%D0%B8%D1%80%D0%B0%D0%BA%D0%B0_%D0%B8_%D0%9E%D1%80%D0%B5&amp;diff=33932"/>
				<updated>2013-12-06T18:07:22Z</updated>
		
		<summary type="html">&lt;p&gt;188.162.64.100: /* Доказательство алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
== Описание алгоритма ==&lt;br /&gt;
Пусть у нас есть граф &amp;lt;tex&amp;gt;\mathbb{G} = \left \langle \mathbb{V, E} \right \rangle&amp;lt;/tex&amp;gt;, удовлетворяющий условию [[Теорема Дирака|теоремы Оре]] или [[Теорема Дирака|теоремы Дирака]], и требуется найти в нем гамильтонов цикл. Поступим следующим образом: заведем очередь и положим в нее все вершины нашего графа(не важно в каком порядке). Теперь &amp;lt;tex&amp;gt;n = \left | \mathbb{V}\right |&amp;lt;/tex&amp;gt; раз будем делать следующую операцию:&lt;br /&gt;
&lt;br /&gt;
* Если между первой (здесь и далее первая вершина - вершина в голове очереди) и второй вершиной в очереди есть ребро в графе &amp;lt;tex&amp;gt;\mathbb{G}&amp;lt;/tex&amp;gt;, то перемещаем первую вершину в конец очереди и переходим к следующей итерации.&lt;br /&gt;
* Если между первой и второй вершиной в очереди ребра нет, то найдем вершину &amp;lt;tex&amp;gt;v_i&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;i &amp;gt; 2&amp;lt;/tex&amp;gt;, такую что, ребра &amp;lt;tex&amp;gt;v_1v_i, v_2v_{i+1} \in \mathbb{E}&amp;lt;/tex&amp;gt; (так как у нас для графа выполнена либо [[Теорема Оре|теорема Оре]], либо [[Теорема Дирака|теорема Дирака]], то такая вершина обязательно найдется; чуть позже мы это докажем явно). После чего поменяем в очереди местами вершины &amp;lt;tex&amp;gt;v_2&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v_i&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;v_3&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v_{i-1}&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;v_{2+j} &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;v_{i-j}&amp;lt;/tex&amp;gt;, и так далее, пока &amp;lt;tex&amp;gt;2 + j &amp;lt; i - j&amp;lt;/tex&amp;gt; (то есть &amp;lt;tex&amp;gt;j&amp;lt;/tex&amp;gt; пробегает все значения от 0 до значения заданного неравенством). Теперь у нас появилось ребро между первой и второй вершинами в очереди (теперь вторая вершина, это та, которая была до разворота на &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;(i+1)&amp;lt;/tex&amp;gt;-й вершинами очереди. После этого, так же как и в первом случае, оправляем первую вершину в конец очереди.&lt;br /&gt;
&lt;br /&gt;
Таким образом после &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; итераций, мы получаем последовательность (вершины лежащие в очереди), где любые 2 соседние вершины соединены ребром, все вершины графа находятся в этой последовательности, и более того, каждая ровно один раз, а так же существует ребро между последней и первой вершинами очереди, а это и значит, что мы решили поставленную задачу.&lt;br /&gt;
&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
{| width = 100%&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
  Queue queue;                              // создаем очередь&lt;br /&gt;
  for i = 0 to n - 1                        // &lt;br /&gt;
    queue.pushback(v[i])                    // добавляем в очередь все вершины графа&lt;br /&gt;
  for k = 0 to n - 1                        // пока не проделано нужное количество итераций&lt;br /&gt;
    if !exist(queue.at(0), queue.at(1))     // проверяем существования ребра между первой и второй вершинами очереди&lt;br /&gt;
      queue.swapSubQueue(2, find_vertex())  // если, не существует, то меняем порядок вершин в очереди, со второй до &lt;br /&gt;
                                            // найденной, удовлетворяющей нас позиции&lt;br /&gt;
  &lt;br /&gt;
|width = &amp;quot;310px&amp;quot; |&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Доказательство алгоритма ==&lt;br /&gt;
Для доказательства корректности алгоритма достаточно показать:&lt;br /&gt;
&lt;br /&gt;
* Каждый раз, когда нам надо искать вершину &amp;lt;tex&amp;gt;v_i&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;i &amp;gt; 2&amp;lt;/tex&amp;gt;, такую что &amp;lt;tex&amp;gt;v_1v_i, v_2v_{i+1} \in \mathbb{E}&amp;lt;/tex&amp;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;S = \{i\mid v_1v_i \in \mathbb{E}\}&amp;lt;/tex&amp;gt;, состоящее из вершин, смежных с &amp;lt;tex&amp;gt;v_1&amp;lt;/tex&amp;gt;, и множество &amp;lt;tex&amp;gt;T = \{i+1 \mid v_2v_{i+1} \in \mathbb{E}\}&amp;lt;/tex&amp;gt;, вершин смежных с &amp;lt;tex&amp;gt;v_2&amp;lt;/tex&amp;gt;. Заметим, что &amp;lt;tex&amp;gt;S \subset \{3, 4,...,n\}&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;T \subset \{2, 3,...,n - 1\}&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;S\cup T\subset \{2, 3,...,n\} &amp;lt;/tex&amp;gt;, а значит &amp;lt;tex&amp;gt;\left\vert S\cup T\right\vert \le n-1&amp;lt;/tex&amp;gt;, в то же время &amp;lt;tex&amp;gt;\left\vert S \right\vert + \left\vert T \right\vert = \operatorname{deg} v_1 + \operatorname{deg} v_2 \ge n&amp;lt;/tex&amp;gt; (по условию [[Теорема Оре|теоремы Оре]] или [[Теорема Дирака|теоремы Дирака]]). Из этого следует, что &amp;lt;tex&amp;gt;S\cap T\ne \varnothing&amp;lt;/tex&amp;gt;, а это и значит, что искомая вершина существует.&lt;br /&gt;
&lt;br /&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; увеличиваем количество пар соседних в очереди вершин, между которыми есть ребро, как минимум на 1 (это прямое следствие условия поиска нужной вершины, в случае отсутствия ребра), а такие пар изначально не более &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;. Откуда следует, что после &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; итераций, второе условие будет выполнено.&lt;br /&gt;
&lt;br /&gt;
== Сложность алгоритма ==&lt;br /&gt;
Алгоритм работает за &amp;lt;tex&amp;gt;O(n^2)&amp;lt;/tex&amp;gt;. Действительно, количество итераций внешнего цикла &amp;lt;tex&amp;gt;\mathrm{for}&amp;lt;/tex&amp;gt; всегда равно &amp;lt;tex&amp;gt;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^2)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== См.также ==&lt;br /&gt;
*[[Гамильтоновы графы]]&lt;br /&gt;
*[[Теорема Оре]]&lt;br /&gt;
*[[теорема Дирака|Теорема Дирака]]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;br /&gt;
[[Категория: Обходы графов]]&lt;/div&gt;</summary>
		<author><name>188.162.64.100</name></author>	</entry>

	</feed>