Гамильтоновы графы — различия между версиями
(→Теорема Хватала) |
(→Алгорит нахождения гамильтового цикла) |
||
| Строка 81: | Строка 81: | ||
}} | }} | ||
| − | == | + | ==Алгоритм нахождения гамильтового цикла== |
| − | + | ||
| − | + | Приведём два алгоритма поиска гамильтонова цикла. | |
| − | + | ||
| − | + | bool check_hamiltonian(graph g, bool[] used, int vert, int count, int[] next): | |
| − | + | if (count == g.vertices): | |
| − | + | next[vert] = 0 | |
| − | + | return (vert; 0) in g.edges | |
| − | + | for (i = 0; i < g.vertices; i++): | |
| − | + | if (!used[i] && (vert; i) in g.edges): | |
| − | + | used[i] = true | |
| − | + | next[vert] = i | |
| − | + | if (check_hamiltonian(g, used, i, count + 1, next)): | |
| − | + | return true | |
| − | + | used[i] = false | |
| − | + | return false | |
| + | |||
| + | * used — отметки о посещении | ||
| + | * vert — текущая вершина | ||
| + | * count — количество посещённых вершин | ||
| + | |||
| + | Приведённая процедура работает следующим образом: перебираются всё рёбра из текущей вершины в ещё не посещённые. Чтобы проверить граф на гамильтоновость, необходимо запустить процедуру из вершины с номером 0 и параметром count = 1. Если процедура возвращает true, то в массиве next будет храниться следующая вершина на гамильтоновом цикле. | ||
==Источники== | ==Источники== | ||
Версия 23:30, 17 января 2012
Содержание
Основные определения
| Определение: |
| Гамильтоновым путём называется простой путь, приходящий через каждую вершину графа ровно один раз. |
| Определение: |
| Гамильтоновым циклом называют замкнутый гамильтонов путь. |
| Определение: |
| Граф называется полугамильтоновым, если он содержит гамильтонов путь. |
| Определение: |
| Граф называется гамильтоновым, если он содержит гамильтонов цикл. |
Очевидно, что любой гамильтонов граф также и полугамильтонов.
Достаточные условия гамильтоновости графа
Теорема Дирака
| Теорема: |
Если и для любой вершины неориентированного графа , то - гамильтонов граф. |
Теорема Оре
| Теорема: |
Если и для любых двух различных несмежных вершин и неориентированного графа , то - гамильтонов граф. |
Теорема Редеи-Камиона
| Теорема: |
Любой сильносвязный турнир - гамильтонов. |
Теорема Гуйя-Ури
| Теорема: |
Пусть G - сильносвязный ориентированный граф. G - гамильтонов. |
Теорема Хватала
| Теорема (Хватал): |
Пусть:
Тогда если верна импликация: |
Теорема Поша
| Теорема: |
Пусть граф G имеет вершин. Если для всякого число вершин со степенями, не превосходящими , меньше чем , и для нечетного число вершин степени не превосходит , то G - гамильтонов граф. |
Алгоритм нахождения гамильтового цикла
Приведём два алгоритма поиска гамильтонова цикла.
bool check_hamiltonian(graph g, bool[] used, int vert, int count, int[] next):
if (count == g.vertices):
next[vert] = 0
return (vert; 0) in g.edges
for (i = 0; i < g.vertices; i++):
if (!used[i] && (vert; i) in g.edges):
used[i] = true
next[vert] = i
if (check_hamiltonian(g, used, i, count + 1, next)):
return true
used[i] = false
return false
- used — отметки о посещении
- vert — текущая вершина
- count — количество посещённых вершин
Приведённая процедура работает следующим образом: перебираются всё рёбра из текущей вершины в ещё не посещённые. Чтобы проверить граф на гамильтоновость, необходимо запустить процедуру из вершины с номером 0 и параметром count = 1. Если процедура возвращает true, то в массиве next будет храниться следующая вершина на гамильтоновом цикле.
Источники
- Харари Ф. Теория графов: Пер. с англ. / Предисл. В. П. Козырева; Под ред. Г.П.Гаврилова. Изд. 4-е. — М.: Книжный дом "ЛИБРОКОМ", 2009. — 60 с.
- Седжвик Р. Фундаментальные алгоритмы на C++. Алгоритмы на графах. — СПб: ООО «ДиаСофтЮП», 2002.
- Гамильтонов граф