- •Курсовая работа по курсу «Дискретная математика»
- •Некоторые базисные алгоритмы обработки графов
- •Нахождение минимального пути в графе
- •Найти минимальные пути от фиксированной вершины до произвольной вершины графа, используя алгоритм Дейкстры.
- •Найти минимальные пути от фиксированной вершины до произвольной вершины графа, используя алгоритм Форда-Беллмана.
- •А л г о р и т м Форда – Беллмана
- •Найти минимальные пути между всеми парами вершин, используя алгоритм Флойда.
- •Эйлеровы цепи и циклы
- •Построить эйлеров цикл в графе. А л г о р и т м построения эйлерова цикла
- •Построить эйлерову цепь в графе.
- •Гамильтоновы цепи и циклы
- •Генерирование всех перестановок заданного множества
- •Генерирование всех перестановок заданного множества в лексикографическом порядке
- •Рекурсивный алгоритм генерирования всех перестановок заданного множества в лексикографическом порядке
- •В первой перестановке элементы идут в растущей последовательности, а в последней – в убывающей другими словами последняя перестановка является обращением первой,
- •Генерирование всех перестановок заданного множества в антилексикографическом порядке
- •Найти минимальный остов графа, используя алгоритм Краскала.
- •Найти минимальный остов графа, используя алгоритм Прима.
- •Поиск в графах
- •Алгоритм с возвратом
- •Раскраска графа
- •Алгоритм раскрашивания графов
- •Найти хроматическое число заданного графа, используя алгоритм с возвратом для нахождения независимых множеств вершин, указать, какие вершины в какой цвет окрашиваются.
- •Найти хроматический класс заданного графа, используя алгоритм с возвратом для нахождения независимых множеств вершин реберного графа, указать, какие ребра в какой цвет окрашиваются.
- •Паросочетания
- •Построения полного потока в сети
- •Максимальный поток
- •Построения максимального потока
- •Алгоритм меток для нахождения максимального потока
- •Помечивающий алгоритм Форда – Фалкерсона для нахождения максимального потока
- •Некоторые прикладные задачи
- •Задачи об источниках и потребителях
- •Решить задачу об источниках и потребителях, сведя ее к задаче построения максимального потока в транспортной сети и используя первый алгоритм построения максимального потока .
- •Двудольные графы и паросочетания
- •Нахождение наибольшего паросочетания в двудольном графе
- •Построение совершенного паросочетания в двудольном графе
- •Системы различных представителей
-
Эйлеровы цепи и циклы
Пусть G – псевдограф. Цепь (цикл) в G называется эйлеровой (эйлеровым), если она (он) проходит по одному разу через каждое ребро псевдографа G.
Для того, чтобы связный псевдограф G обладал эйлеровым циклом, необходимо и достаточно, чтобы степени его вершин были четными.
Для того, чтобы связный псевдограф G обладал эйлеровой цепью, необходимо и достаточно, чтобы он имел ровно две вершины нечетной степени. Если указанное условие выполняется, то любая эйлерова цепь псевдографа G соединяет вершины нечетной степени.
Пусть G – связный мультиграф, степени вершин которого – четные числа.
-
Построить эйлеров цикл в графе. А л г о р и т м построения эйлерова цикла
Данные: матрица инцидентности В(G) мультиграфа G.
Результат: последовательность ребер, образующих эйлеров цикл.
-
Выбрать произвольную вершину v.
-
Выбрать произвольное ребро x, инцидентное v, и присвоить ему номер 1. (Назовем это ребро “пройденным”).
-
Каждое пройденное ребро вычеркивать и присваивать ему номер, на единицу больший номера предыдущего вычеркнутого ребра.
-
Находясь в вершине w, не выбирать ребра, соединяющего w с v, если только есть возможность другого выбора.
-
Находясь в вершине w, не выбирать ребра, которое является “перешейком” (при удалении которого граф, образованный незачеркнутыми ребрами, распадается на две компоненты связности, имеющие хотя бы по одному ребру).
-
После того, как в графе будут занумерованы все ребра, цикл = [xi1, xi2,…, xim], образованный ребрами с номерами от 1 до m, где m – число ребер в графе, есть эйлеров цикл.
Замечание. Прежде чем строить эйлеров цикл, проверить условие существования этого цикла.
-
Построить эйлерову цепь в графе.
Изменить алгоритм построения эйлерова цикла так, чтобы можно было использовать его для построения эйлеровой цепи в графе.
-
Гамильтоновы цепи и циклы
Пусть G – псевдограф. Цепь (цикл) в G называется гамильтоновой (гамильтоновым), если она (он) проходит через каждую вершину псевдографа G ровно один раз. Простейшим достаточным условием существования гамильтоновых цепей и циклов в графе является его полнота. Граф G называется полным, если каждая его вершина смежна со всеми остальными вершинами. Необходимым условием существования гамильтоновых цепей и циклов в графе G является связность данного графа.
Приведем некоторые наиболее простые методы выделения гамильтоновых цепей и циклов в графе G =(V,X), где V = {v1 ,v2 ,…,vn}. Самым простым является метод перебора всевозможных перестановок vi1 ,vi2 ,…,vin множества V. Для каждой из них проверяем, является ли vi1vi2…vin маршрутом в G. Если является, то vi1vi2 …vin - гамильтонова цепь в G, в противном случае переходим к другой перестановке. Тогда по окончании перебора будут выделены все гамильтоновы цепи в графе G. Аналогично для выделения гамильтоновых циклов перебираем всевозможные перестановки v1vi1vi2 …vin-1 множества V, для каждой из которых проверяем, является ли v1vi1vi2…vin-1v1 маршрутом в G. Если является, то v1vi1vi2…vin-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.