Алгоритм нахождения Гамильтонова цикла в условиях теорем Дирака и Оре — различия между версиями
Ak57 (обсуждение | вклад) м (→Псевдокод) |
Ak57 (обсуждение | вклад) (→Доказательство алгоритма) |
||
Строка 30: | Строка 30: | ||
\subset \{2, 3, ...,n-1\}</tex>. | \subset \{2, 3, ...,n-1\}</tex>. | ||
Тогда <tex>S \cup T \subset \{2,3,...,n\}</tex>, откуда <tex>|S \cup T |< n</tex>. Но <tex>|S|+|T| = \operatorname{deg}\ v_1 + \operatorname{deg}\ v_2 \ge n</tex> по условию [[Теорема Оре|теоремы Оре]] или [[Теорема Дирака|теоремы Дирака]], в зависимости от наших начальных условий. А значит <tex>S \cap T \ne \varnothing</tex>, следовательно искомая вершина обязательно найдется. | Тогда <tex>S \cup T \subset \{2,3,...,n\}</tex>, откуда <tex>|S \cup T |< n</tex>. Но <tex>|S|+|T| = \operatorname{deg}\ v_1 + \operatorname{deg}\ v_2 \ge n</tex> по условию [[Теорема Оре|теоремы Оре]] или [[Теорема Дирака|теоремы Дирака]], в зависимости от наших начальных условий. А значит <tex>S \cap T \ne \varnothing</tex>, следовательно искомая вершина обязательно найдется. | ||
− | + | Теперь заметим, что после <tex>k</tex>-ой итерации внешнего цикла между всеми парами вершин <tex>\mathrm{v}_{i}, \mathrm{v}_{i+1}</tex>, где <tex>i \le k</tex> существует ребро, а значит после <tex>n</tex> итераций мы найдем цикл. | |
== Сложность алгоритма == | == Сложность алгоритма == |
Версия 19:49, 6 ноября 2013
Содержание
Описание алгоритма
Алгоритм находит гамильтонов цикл в неориентированном графе , если выполняются условия теоремы Оре или выполнена теорема Дирака. Рассмотрим перестановку вершин , где . Если между каждой парой соседних вершин в перестановке существует ребро, то мы получили Гамильтонов цикл. В противном случае, начиная с пары , начнем последовательно рассматривать пары соседних вершин , пока (Когда , за считаем ).
- Если между ними есть ребро, то переходим к следующей паре вершин .
- Если же ребра нет, то найдем такую вершину
- Если то перевернем часть перестановки от до (включительно).
- Если обменяем в перестановке элементы на позициях и , где , то есть считаем равной . Например, если , то и поменяются местами, а останется на месте.
(то, что она всегда существует, будет показано ниже), что , и существуют ребра и (Если , то за считаем ).
Псевдокод
for i = 1 to n // перебираем все вершины перестановкиif // если нет ребра между for // перебираем все остальные вершины if && // если есть ребра reverse_subsequence( ) // разворачиваем часть перестановки от i+1 позиции до j break // переходим к следующей итерации внешнего for |
Доказательство алгоритма
Заметим, что поскольку мы сделали нашу перестановку в виде зацикленного списка, то мы можем рассматривать перебор все пар соседних в перестановке вершин, как сдвиг указателя на начало списка. Тогда будем сдвигать указатель на нашу перестановку так, чтобы она начиналась с рассматриваемой пары
. Если теперь между первыми двумя вершинами есть ребро, то можем переходить к рассмотрению следующей пары, так как в этом случае мы ничего не делаем. Если же ребра нет, то докажем, что обязательно найдется вершина , такая что .Пусть теоремы Оре или теоремы Дирака, в зависимости от наших начальных условий. А значит , следовательно искомая вершина обязательно найдется. Теперь заметим, что после -ой итерации внешнего цикла между всеми парами вершин , где существует ребро, а значит после итераций мы найдем цикл.
и . Тогда , откуда . Но по условиюСложность алгоритма
Алгоритм работает за
. Действительно, количество итераций внешнего цикла всегда равно , во внутреннем цикле, в худшем случае, будет выполнено итерации, получаем время работы .