182
int N = Nodes.Length; int v0 = 0;
Lib.arr[1] = v0;
VisitTrue(v0); //
отметить посещенный
Gamilt(2, Items);
}
Необходимо отметить, что информация о проходимом пути накаплива-
ется в
массиве arr[]. При неуспешном выходе из
рекурсивной процедуры
Gamilt
() переустанавливается значение поля
visit = false.
Как и любой алгоритм с возвратом, данный алгоритм имеет экспонен-
циальную скорость роста.
Пример. Рассмотрим граф, у которого
одна вершина изолирована, а
ребра, связывающие остальные (
N
− 1) вершину, образуют полный граф.
Функция
Gamilt() никогда не найдет гамильтонова цикла, но она исследует
все (
N
− 2)! путей, начинающихся в выбранной начальной вершине, каждый
из которых использует (
N
− 1) рекурсивных вызовов. Следовательно, общее
число рекурсивных вызовов равно (
N
− 1)!.
На рисунке 5.14 представлен список гамильтоновых циклов для графа,
содержащего 7 узлов.
Рис. 5.14. Гамильтонов цикл
Do'stlaringiz bilan baham: