Алгоритм нахождения Гамильтонова цикла в условиях теорем Дирака и Оре — различия между версиями
Ak57 (обсуждение | вклад) (→Доказательство алгоритма) |
Ak57 (обсуждение | вклад) |
||
Строка 1: | Строка 1: | ||
__TOC__ | __TOC__ | ||
== Описание алгоритма == | == Описание алгоритма == | ||
− | Алгоритм находит [[Гамильтоновы графы|гамильтонов цикл]] в [[Основные определения теории графов#Неориентированные графы|неориентированном графе]] <tex> \mathbb{G} = (\mathbb{V}, \mathbb{E}) </tex>, если выполняются условия [[Теорема Оре|теоремы Оре]] или выполнена [[теорема Дирака]]. Рассмотрим перестановку вершин <tex> \mathrm{v}_1 \mathrm{v}_2 ... \mathrm{v}_n</tex>, где <tex>n = | \mathbb{V} |</tex>. Если между каждой парой соседних вершин в перестановке существует ребро, то мы получили [[Гамильтоновы графы| | + | Алгоритм находит [[Гамильтоновы графы|гамильтонов цикл]] в [[Основные определения теории графов#Неориентированные графы|неориентированном графе]] <tex> \mathbb{G} = (\mathbb{V}, \mathbb{E}) </tex>, если выполняются условия [[Теорема Оре|теоремы Оре]] или выполнена [[теорема Дирака]]. Рассмотрим перестановку вершин <tex> \mathrm{v}_1 \mathrm{v}_2 ... \mathrm{v}_n</tex>, где <tex>n = | \mathbb{V} |</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> \mathrm{v}_{i+1} \mathrm{v}_{i+2}</tex>. | * Если между ними есть ребро, то переходим к следующей паре вершин <tex> \mathrm{v}_{i+1} \mathrm{v}_{i+2}</tex>. |
Версия 22:43, 6 ноября 2013
Содержание
Описание алгоритма
Алгоритм находит гамильтонов цикл в неориентированном графе , если выполняются условия теоремы Оре или выполнена теорема Дирака. Рассмотрим перестановку вершин , где . Если между каждой парой соседних вершин в перестановке существует ребро, то мы получили гамильтонов цикл. В противном случае, начиная с пары , начнем последовательно рассматривать пары соседних вершин , пока (Когда , за считаем ).
- Если между ними есть ребро, то переходим к следующей паре вершин .
- Если же ребра нет, то найдем такую вершину
- Если то перевернем часть перестановки от до (включительно).
- Если обменяем в перестановке элементы на позициях и , где , то есть считаем равной . Например, если , то и поменяются местами, а останется на месте.
(то, что она всегда существует, будет показано ниже), что , и существуют ребра и (Если , то за считаем ).
Псевдокод
for i = 1 to n // перебираем все вершины перестановкиif // если нет ребра между for // перебираем все остальные вершины if && // если есть ребра reverse_subsequence( ) // разворачиваем часть перестановки от i+1 позиции до j break // переходим к следующей итерации внешнего for |
Доказательство алгоритма
На
-ой итерации внешнего цикла рассматриваются вершины . Возможно 2 случая:- между ними есть ребро, и тогда делать ничего не надо;
- между ними ребра нет, и тогда надо найти такую вершину , что ;
Покажем, что такая вершина обязательно найдется. Пусть теоремы Оре или теоремы Дирака, в зависимости от наших начальных условий. А значит , следовательно искомая вершина обязательно найдется. Теперь заметим, что после -ой итерации внешнего цикла между всеми парами вершин , где существует ребро, а значит после итераций мы найдем цикл.
и . Тогда , откуда . Но по условиюСложность алгоритма
Алгоритм работает за
. Действительно, количество итераций внешнего цикла всегда равно . Во внутреннем цикле в худшем случае будет выполнено итерации, получаем время работы .