Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2260.doc
Скачиваний:
71
Добавлен:
24.09.2019
Размер:
3.71 Mб
Скачать

7.2. Алгоритм Флёри

Естественно возникает вопрос: как найти хотя бы один эйлеров цикл в эйлеровом графе? Приведенное доказательство теоремы Эйлера не позволяет конструктивно находить эйлеров цикл, так как не дает эффективного метода нахождения эйлерова цикла – это явно не лучший способ действий. Приведем один из алгоритмов нахождения эйлерова цикла – алгоритм Флёри.

1. Выбрать произвольную вершину , произвольному ребру присвоить номер 1. Вычеркнуть ребро и перейти в вершину .

2. Пусть – вершина, в которую пришли в результате предыдущего шага, и k – номер, присвоенный ребру на этом шаге. Выбрать любое ребро, инцидентное вершине ; присвоить выбранному ребру номер и вычеркнуть его.

3. Никогда не выбирать мост.

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

Теорема 7.2.1. Алгоритм Флёри строит эйлеров цикл.

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

Предположим, что это не так. Тогда существуют вершины, у которых есть непомеченные инцидентные ребра. Из этих вершин выберем ту, которая инцидентна ребру с наибольшим номером. Тогда это ребро – мост. Получаем противоречие. Следовательно, этот цикл эйлеров.

Далее приведено теоретико-множественное описание работы алгоритма Флёри.

Алгоритм 7.2.1. (Флёри). Алгоритм отыскания эйлерового цикла.

Вход: эйлеров граф G = (V,E), заданный списками смежности вершин.

Выход: последовательность вершин эйлерова цикла.

1. begin

2. SW :=nil, SR :=nil;

3. SW ;

4. for do list ;

5. while SW do

6. begin

7. ;

8. if list then

9. begin

10. u:= первая вершина list ;

11. SW ;

12. list := list ;

13. list := list ;

14. end

15. else

16. begin end

17. end

18. end.

В алгоритме используются два стека SW и SR; элементами каждого стека являются вершины графа G. Кроме того, введен массив list W, элементы которого – списки вершин. Для каждой вершины начальное значение list W[ ] совпадает со списком всех вершин, смежных с вершиной , т.е. с . Запись D :=nil означает дерево с пустым множеством вершин.

Принцип работы этого алгоритма состоит в следующем. Алгоритм начинает работу с некоторой вершины , продвигается по ребрам, причем каждое пройденное ребро из графа удаляется (строки 10–13). Ясно, что последовательное выполнение этой группы операторов позволяет выделить в графе некоторую замкнутую цепь. Затем начинается выполнение группы операторов из строки 16. Эти операторы выталкивают очередную вершину из стека SW в стек SR до тех пор, пока не выполнится одно из условий:

  • стек SW пуст (алгоритм заканчивает работу);

  • для вершины ( находится в вершине стека SW) существует непройденное ребро . В этом случае алгоритм заканчивает работу из вершины u.

Сложность алгоритма 7.2.1 оценивается как , т.е. совпадает с числом ребер мультиграфа.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]