- •В. Н. Степанов дискретная математика: графы и алгоритмы на графах
- •Предисловие
- •1. Основные понятия теории графов
- •1.1. Граф и его разновидности
- •1.2. Морфизмы графов
- •1.3. Степени вершин
- •1.4. Маршруты, цепи, циклы, связность
- •1.5. Операции над графами
- •1.6. Примеры графов
- •1.7. Метрические характеристики графов
- •1.8. Представления графов
- •2. Алгоритмы и сложность
- •2.1. Понятие алгоритма
- •2.2. Сложность алгоритма
- •2.3. Запись алгоритма
- •3. Обходы графов
- •3.1. Поиск в глубину на графе
- •3.2. Поиск в ширину на графе
- •3.3. Алгоритм выделения компонент связности
- •4. Деревья
- •4.1. Деревья. Свойства деревьев
- •4.2. Остовы. Теорема Кирхгофа
- •4.3. Теорема Кэли
- •4.4. Фундаментальная система циклов. Цикломатическое число
- •4.5. Алгоритм отыскания фундаментального множества циклов на графе
- •5. Остов минимального веса. Алгоритм Краскала и Прима
- •5.1. Алгоритм д. Краскала
- •5.2. Алгоритм р. Прима
- •6. Кратчайшие пути между вершинами графа
- •6.1. Алгоритм Дейкстры
- •6.2. Алгоритм Флойда
- •7. Эйлеровы графы
- •7.1. Теорема Эйлера
- •7.2. Алгоритм Флёри
- •8. Гамильтоновы графы
- •8.1. Гамильтоновы маршруты. Задача коммивояжера
- •8.2. Существование гамильтоновых маршрутов
- •9. Алгоритмы отыскания гамильтоновых циклов
- •9.1. Алгоритм с возвратом (полного перебора)
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 (предполагается, что все списки вершин упорядочены по возрастанию номеров).
|