Изменения

Перейти к: навигация, поиск
Описание алгоритма
__TOC__
== Описание алгоритма ==
Алгоритм находит [[Гамильтоновы графы|гамильтонов цикл]] в [[Основные определения теории графов#Неориентированные графы|неориентированном графе]] Пусть у нас есть граф <tex> \mathbb{G} = (\left \langle \mathbb{V}, \mathbb{E}) \right \rangle</tex>, если выполняются условия удовлетворяющий условию [[Теорема ОреДирака|теоремы Оре]] или выполнена [[теорема Теорема Дирака|теоремы Дирака]], и требуется найти в нем гамильтонов цикл. Рассмотрим перестановку вершин <tex> \mathrm{v}_1 \mathrm{v}_2 .Поступим следующим образом: заведем очередь и положим в нее все вершины нашего графа(не важно в каком порядке).. \mathrm{v}_n</tex>, где Теперь <tex>n = \left | \mathbb{V} \right |</tex>. Если между каждой парой соседних вершин в перестановке существует ребро, то мы получили [[Гамильтоновы графы|гамильтонов цикл]]. В противном случае, начиная с пары <tex> \mathrm{v}_1 \mathrm{v}_2 </tex>, начнем последовательно рассматривать пары соседних вершин <tex> \mathrm{v}_i \mathrm{v}_{i+1} </tex>, пока <tex>i \ge n</tex> (когда <tex>i = n</tex>, за <tex>\mathrm{v}_{i+1}</tex> считаем <tex>\mathrm{v}_{1}</tex>). раз будем делать следующую операцию:
* Если между ними первой (здесь и далее первая вершина - вершина в голове очереди) и второй вершиной в очереди есть ребро, то переходим к следующей паре вершин в графе <tex> \mathrmmathbb{v}_{i+1} \mathrm{v}_{i+2G}</tex>, то перемещаем первую вершину в конец очереди и переходим к следующей итерации. * Если же между первой и второй вершиной в очереди ребра нет, то найдем такую вершину <tex>\mathrm{v}_jv_i</tex> (то, такую что она всегда существует, будет показано ниже), что ребра <tex> \mathrmv_1v_i, v_2v_{vi+1}_j \in{\mathbb{V}} \setminus \{ \mathrm{v}_i, \mathrm{v}_{i+1} \E} </tex>(так как у нас для графа выполнена либо [[Теорема Оре|теорема Оре]], и существуют ребра либо [[Теорема Дирака|теорема Дирака]], то такая вершина обязательно найдется; чуть позже мы это докажем явно). После чего поменяем в очереди местами вершины <tex> \mathrm{v}_i \mathrm{v}_jv_2</tex> и <tex> \mathrm{v}_{i+1} \mathrm{v}_{j+1} v_i</tex> (Если , <tex> j = nv_3</tex> , то за и <tex>\mathrmv_{v}_{j+i-1}</tex> считаем , <tex>\mathrmv_{v}_{12+j}</tex>).** Если и <tex>v_{i < -j }</tex> то перевернем часть перестановки от , и так далее, пока <tex> i2 +1 j </tex> до <tex> i - j </tex> (включительно).** Если то есть <tex> i > j </tex> обменяем пробегает все значения от 0 до значения заданного неравенством). Теперь у нас появилось ребро между первой и второй вершинами в перестановке элементы очереди (теперь вторая вершина, это та, которая была до разворота на позициях <tex> (i + 1 + k)\ \operatorname{mod}\ n </tex> и <tex> (j - k +nй позиции)\ \operatorname{mod}\ n </tex>, где <tex>k = \overline{0а так же, (j + n - i)\ \operatorname{div}\ 2}</tex>, то есть считаем гарантированно существует ребро между <tex>\mathrm{v}_{i}...\mathrm{v}_{j}</tex> равной -й и <tex>\mathrm{v}_{(i}...\mathrm{v}_{n}\mathrm{v}_{+1}...\mathrm{v}_{j})</tex>-й вершинами очереди. НапримерПосле этого, так же как и в первом случае, если оправляем первую вершину в конец очереди. Таким образом после <tex>n = 10, i = 8, j = 1</tex>итераций, мы получаем последовательность (вершины лежащие в очереди), где любые 2 соседние вершины соединены ребром, все вершины графа находятся в этой последовательности, и более того, то <tex>\mathrm{v}_9 </tex> каждая ровно один раз, а так же существует ребро между последней и <tex>\mathrm{v}_1</tex> поменяются местамипервой вершинами очереди, а <tex>\mathrm{v}_{10}</tex> останется на местеэто и значит, что мы решили поставленную задачу.
== Псевдокод ==
71
правка

Навигация