Гамильтоновы цепи и циклы

 

 

Пусть G псевдограф. Цепь (цикл) в G называется гамильтоновой (гамильтоновым), если она (он) проходит через каждую вершину псевдографа G ровно один раз. Простейшим достаточным условием существования гамильтоновых цепей и циклов в графе является его полнота. Граф G называется полным, если каждая его вершина смежна со всеми остальными вершинами. Необходимым условием существования гамильтоновых цепей и циклов в графе G является связность данного графа.

Приведем некоторые наиболее простые методы выделения гамильтоновых цепей и циклов в графе G =(V,X), где V = { v1,v2,…,vn }. Самым простым является метод перебора всевозможных перестановок vi1,vi2,…,vin множества V. Для каждой из них проверяем, является ли vi1vi2…vin маршрутом в G. Если является, то vi1vi2 …vin - гамильтонова цепь в G, в противном случае переходим к другой перестановке. Тогда по окончании перебора будут выделены все гамильтоновы цепи в графе G. Аналогично для выделения гамильтоновых циклов перебираем всевозможные перестановки v1vi1vi2 …vin-1 множества V, для каждой из которых проверяем, является ли v1vi1vi2…vin-1v1 маршрутом в G. Если является, то v1vi1vi2…vin-1v1 – гамильтонов цикл в G, в противном случае переходим к следующей перестановке. Тогда по окончании перебора будут выделены все гамильтоновы циклы в графе G. Очевидно, что при выделении гамильтоновых цепей придется перебрать n! перестановок, а при выделении всех гамильтоновых циклов - (n -1)! перестановок. При этом в случае полного графа ни одна из перестановок не окажется отброшенной, т.е. данный метод является эффективным для графов, близких к полным.

Отметим, что описанный метод не учитывает информации об исследуемом графе G и является как бы ориентированным на самый “худший” случай, когда G – полный граф.

Для того, чтобы сократить число шагов в предложенном методе, рассмотрим следующий алгоритм. Предположим, что решение имеет вид последовательности < v 1 ,... v n>. Идея метода состоит в следующем: решение строится последовательно, начиная с пустой последовательности (длины 0). Далее, имея частичное решение < v1, ... v i>, ищем такое допустимое значение v i+1, которое еще не было использовано, добавляем его к пройденному частичному решению и продолжаем процесс для нового частичного решения < v 1 ,... v i+1>. В противном случае, если такого значения v i+1 не существует, возвращаемся к предыдущему частичному решению < v 1,... v i-1> и продолжаем процесс, пытаясь определить новое, еще не использованное допустимое значение v k. Такие алгоритмы носят название “алгоритмы с возвратом” (англ.: backtracking).

 

 

2 1

 
 


1 5 3 12 14

                   
         
 
 
 


123 125 143 145

 

1234 1235 1253 1254 1432 1435 1452 1453

14321 14352

12341 12354 12534

14325 14521 14532

12345 12541 12543 14523

123541 125341 143521 145321

 

Рис. 2

Процесс поиска с возвращением удобно проиллюстрировать в терминах обхода в глубину в некотором дереве поиска, которое строится следующим образом. Каждая вершина дерева соответствует некоторому частичному решению < v 1, ...v i>, причем вершины, соответствующие последовательностям вида < v 1, .. v i, y >, и являются преемниками вершины < v 1,... v i>. Корнем данного дерева является пустая последовательность. В случае построения гамильтонова цикла в качестве корня может выступать любая вершина.

При обходе дерева в глубину вершины дерева посещаются в таком порядке: сначала посещаем корень дерева v 1, а затем (если v 1 – не висячая вершина) для каждого преемника v i корня v 1 рекурсивно обращаемся к процедуре обхода в глубину для того, чтобы обойти все поддеревья с корнями v i в порядке, в котором упорядочены вершины v i как преемники корня v 1.

Пример.

На рис.2 показаны граф и дерево, иллюстрирующее процесс нахождения всех гамильтоновых циклов с помощью алгоритма с возвратом.

Гамильтоновы циклы – 123541, 125341, 143521, 145321.

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: