Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курс_заочн(27 вар).doc
Скачиваний:
79
Добавлен:
21.12.2018
Размер:
444.93 Кб
Скачать
    1. Эйлеровы цепи и циклы

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

Для того, чтобы связный псевдограф G обладал эйлеровым циклом, необходимо и достаточно, чтобы степени его вершин были четными.

Для того, чтобы связный псевдограф G обладал эйлеровой цепью, необходимо и достаточно, чтобы он имел ровно две вершины нечетной степени. Если указанное условие выполняется, то любая эйлерова цепь псевдографа G соединяет вершины нечетной степени.

Пусть G – связный мультиграф, степени вершин которого – четные числа.

      1. Построить эйлеров цикл в графе. А л г о р и т м построения эйлерова цикла

Данные: матрица инцидентности В(G) мультиграфа G.

Результат: последовательность ребер, образующих эйлеров цикл.

  1. Выбрать произвольную вершину v.

  2. Выбрать произвольное ребро x, инцидентное v, и присвоить ему номер 1. (Назовем это ребро “пройденным”).

  3. Каждое пройденное ребро вычеркивать и присваивать ему номер, на единицу больший номера предыдущего вычеркнутого ребра.

  4. Находясь в вершине w, не выбирать ребра, соединяющего w с v, если только есть возможность другого выбора.

  5. Находясь в вершине w, не выбирать ребра, которое является “перешейком” (при удалении которого граф, образованный незачеркнутыми ребрами, распадается на две компоненты связности, имеющие хотя бы по одному ребру).

  6. После того, как в графе будут занумерованы все ребра, цикл  = [xi1, xi2,…, xim], образованный ребрами с номерами от 1 до m, где m – число ребер в графе, есть эйлеров цикл.

Замечание. Прежде чем строить эйлеров цикл, проверить условие существования этого цикла.

      1. Построить эйлерову цепь в графе.

Изменить алгоритм построения эйлерова цикла так, чтобы можно было использовать его для построения эйлеровой цепи в графе.

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

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

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

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

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

2 1

1 5 3 12 14

4

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

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

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

Пример.

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

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