- •В. Н. Степанов дискретная математика: графы и алгоритмы на графах
- •Предисловие
- •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 (предполагается,
что все списки вершин упорядочены по
возрастанию номеров).
|
