- •Иркутский государственный технический университет
- •1. Определения графов
- •7.4.5. Массив дуг
- •8.4.2. Трансверсаль
- •8.5.4. Алгоритм нахождения максимального потока
- •8.6.3. Выделение компонент сильной связности
- •8.7.1. Длина дуг
- •8.7.2. Алгоритм Флойда
- •8.7.3. Алгоритм Дейкстры
- •Глава 9 Деревья
- •9.1. Свободные деревья
- •9.1.1. Определения
- •9.1 .2. Основные свойства деревьев
- •9.2. Ориентированные, упорядоченные и бинарные деревья
- •9.2.1. Ориентированные деревья
- •9.2.2. Эквивалентное определение ордерева
- •9.2.3. Упорядоченные деревья
- •9.2.4. Бинарные деревья
- •9.3. Представление деревьев в эвм
- •9.3.1. Представление свободных, ориентированных и упорядоченных деревьев
- •9.3.2. Представление бинарных деревьев
- •9.3.3. Обходы бинарных деревьев
- •9.3.4. Алгоритм симметричного обхода бинарного дерева
- •9.4. Деревья сортировки
- •9.4.1. Ассоциативная память
- •9.4.2. Способы реализации ассоциативной памяти
- •9.4.3. Алгоритм бинарного (двоичного) поиска
- •9.4.4. Алгоритм поиска в дереве сортировки
- •9.4.5. Алгоритм вставки в дерево сортировки
- •9.4.6. Алгоритм удаления из дерева сортировки
- •9.4.7. Вспомогательные алгоритмы для дерева сортировки
- •9.4.8. Сравнение представлений ассоциативной памяти
- •9.4.9. Выровненные деревья
- •9.4.10. Сбалансированные деревья
- •9.5. Кратчайший остов
- •9.5.1. Определения
- •9.5.2. Схема алгоритма построения кратчайшего остова
- •9.5.3. Алгоритм Краскала
- •Глава 10 Циклы
- •10.1. Фундаментальные циклы и разрезы
- •10.1.1. Циклы и коциклы
- •10.1.2. Независимые множества циклов и коциклов
- •10.1.3. Циклический и коциклический ранг
- •10.2. Эйлеровы циклы
- •10.2.1. Эйлеровы графы
- •10.2.2. Алгоритм построения эйлерова цикла в эйлеровом графе
- •10.2.3. Оценка числа эйлеровых графов
- •10.3. Гамильтоновы циклы
- •10.3.1. Гамильтоновы графы
- •10.3.2. Задача коммивояжера
- •Глава 11 Независимость и покрытия
- •11.1. Независимые и покрывающие множества
- •11.1.1. Покрывающие множества вершин и ребер
- •11.1.2. Независимые множества вершин и ребер
- •11.1.3. Связь чисел независимости и покрытий
- •11.2. Построение независимых множеств вершин
- •11.2.1. Постановка задачи отыскания наибольшего независимого множества вершин
- •11.2.2. Поиск с возвратами
- •11.2.3. Улучшенный перебор
- •11.2.4. Алгоритм построения максимальных независимых множеств вершин
- •11.3. Доминирующие множества
- •11.3.1. Определения
- •11.3.2. Доминирование и независимость
- •11.3.3. Задача о наименьшем покрытии
- •11.3.4. Эквивалентные формулировки знп
- •11.3.5. Связь знп с другими задачами
- •Глава 12 Раскраска графов
- •12.1. Хроматическое число
- •Ух, . . . ,Vn одноцветные классы,доказательство
- •12.2. Планарность
- •12.2.2. Эйлерова характеристика
- •12.2.3. Теорема о пяти красках
- •12.3. Алгоритмы раскрашивания
- •12.3.1. Точный алгоритм раскрашивания
- •12.3.2. Приближенный алгоритм последовательного раскрашивания
- •12.3.3. Улучшенный алгоритм последовательного раскрашивания
10.2. Эйлеровы циклы
Здесь приведено исчерпывающее решение задачи о Кенигсбергских мостах (см. подраздел 7.1.1), приведшей к исторически первой успешной попытке развития теории графов как самостоятельного предмета.
10.2.1. Эйлеровы графы
Если граф имеет цикл (не обязательно простой), содержащий все ребра графа по одному разу, то такой цикл называется эйлеровым циклом, а граф называется эйлеровым графом. Если граф имеет цепь (не обязательно простую), содержащую все вершины по одному разу, то такая цепь называется эйлеровой цепью, а граф называется полуэйлеровым графом.
Эйлеров цикл содержит не только все ребра (по одному разу), но и все вершины графа (возможно, по несколько раз). Ясно, что эйлеровым может быть только связный граф.
ТЕОРЕМА Если граф G связен и нетривиален, то следующие утверждения эквивалентны:
G — эйлеров граф;
каждая вершина G имеет четную степень;
множество ребер G можно разбить на простые циклы.
доказательство
1 => 2 Пусть Z — эйлеров цикл. Двигаясь по Z, будем подсчитывать степе-
ни вершин, полагая их до начала прохождения нулевыми. Прохождение каждой вершины вносит 2 в степень этой вершины. Поскольку Z содержит все ребра, то когда обход Z будет закончен, будут учтены все ребра, а степени всех вершин — четные.
2 => 3 G — связный и нетривиальный граф, следовательно, Vv d(v) > 0. Степени
вершин четные, следовательно, Vv d(v) ^ 2. Имеем:
2q = d(v) ^ 2р
^ р => q > р - 1.
Следовательно, граф G — не дерево, а значит, граф G содержит (хотя бы один) простой цикл Z\. (Zi — множество ребер.) Тогда G - Z\ -остовный подграф, в котором опять все степени вершин четные. Исключим из рассмотрения изолированные вершины. Таким образом, G - Zi тоже удовлетворяет условию 2, следовательно, существует простой цикл Z2 С (G—Zi). Далее выделяем циклы Zi, пока граф не будет пуст. Имеем: Е = Zi и П Zi = 0.
3 =4> 1 Возьмем какой-либо цикл Z\ из данного разбиения. Если Zi = Е, то теорема доказана. Если нет, то существует цикл Z%, такой что
3ui (vi e Zi&v-i е Z2),
так как G связен. Маршрут Z\ U Z2 является циклом и содержит все свои ребра по одному разу. Если Z\ U Z2 = Я, то теорема доказана. Если нет, то существует цикл Z3, такой что Зи2 (г;2 € Zi U Z2&i;2 G Z3). Далее будем наращивать эйлеров цикл, пока он не исчерпает разбиения. П

10.2.2. Алгоритм построения эйлерова цикла в эйлеровом графе
В предыдущем разделе был установлен эффективный способ проверки наличия эйлерова цикла в графе. А именно, для этого необходимо и достаточно убедиться, что степени всех вершин четные, что нетрудно сделать при любом представлении графа. Следующий алгоритм находит эйлеров цикл в графе, если известно, что граф эйлеров.
Алгоритм 10.1. Алгоритм построения эйлерова цикла
Вход: эйлеров граф G(V, Е), заданный списками смежности (Г[г>] — список вершин, смежных с вершиной v).
Выход: последовательность вершин эйлерова цикла. S: = 0 { стек для хранения вершин } select v G V { произвольная вершина } v —> S { положить v в стек S } while S ф 0 do
v <r- S;v —> S {v — верхний элемент стека } if Г>] = 0 then v 4- 5; yield v else
select u € T[v] { взять первую вершину из списка смежности } и —¥ S { положить и в стек }
1>]: = 1>] \ {и}; Г [и]: = Г [и] \ {v} { удалить ребро (v, и) } end if end while
обоснование
Принцип действия этого алгоритма заключается в следующем. Начиная с произ вольной вершины, строим путь, удаляя ребра и запоминая вершины в стеке, до тех пор пока множество смежности очередной вершины не окажется пустым, что означает, что путь удлинить нельзя. Заметим, что при этом мы с необходимостью придем в ту вершину, с которой начали. В противном случае это означало бы, что вершина v имеет нечетную степень, что невозможно по условию. Таким образом, из графа были удалены ребра цикла, а вершины цикла были сохранены в стеке 5. Заметим, что при этом степени всех вершин остались четными. Далее вершина v выводится в качестве первой вершины эйлерова цикла, а процесс продолжается, начиная с вершины, стоящей на вершине стека.
