- •010400.62 Прикладная математика и информатика
- •Предисловие
- •1. Элементы математической логики
- •1.1. Логические связки и их таблицы истинности
- •1.2. Свойства логических операций
- •1.3. Функции алгебры логики и их свойства
- •1.4. Совершенные формы
- •1.5. Многочлены Жегалкина
- •Примеры решения задач
- •Упражнения
- •Вопросы для самоконтроля и повторения
- •2. Множества и отображения
- •2.1. Множества
- •2.2. Операции над множествами.
- •2.3. Свойства операций над множествами
- •2.4. Отображения множеств
- •Примеры решения задач
- •Упражнения
- •Вопросы для самоконтроля и повторения
- •3. Элементы комбинаторного анализа
- •Примеры решения задач
- •Упражнения
- •Вопросы для самоконтроля и повторения
- •4. Элементы теории графов
- •4.1. Основные понятия теории графов
- •4.2. Основные операции над графами
- •4.3. Матрицы графов
- •4.4. Мосты, деревья
- •4.5. Алгоритмы построения минимального остовного дерева
- •4.6 Задача о кратчайшем пути и алгоритм Дейкстры для ее решения
- •4.7. Дерево кратчайших путей
- •4.8. Гамильтоновы циклы и гамильтоновы графы
- •4.9. Эйлеровы циклы и эйлеровы графы
- •Примеры решения задач
- •Алгоритм Дейкстры-Прима
- •Упражнения
- •Вопросы для самоконтроля и повторения
- •5. Теория кодирования
- •5.1. Основные понятия теории кодирования
- •5.2. Проблема взаимной однозначности
- •5.3. Коды Хемминга
- •Примеры решения задач
- •Упражнения
- •Вопросы для самоконтроля и повторения
- •6. Теория автоматов
- •6.1. Основные понятия теории автоматов
- •6.2. Способы задания конечного автомата
- •Примеры решения задач
- •Упражнения
- •Вопросы для самоконтроля и повторения
- •7. Задания для самостоятельной работы
- •Библиографический список
- •Мария Николаевна Рыжкова Андрей Владимирович Макаров
- •010400.62 Прикладная математика и информатика
4.5. Алгоритмы построения минимального остовного дерева
1) Алгоритм Краскала построения минимального остовного дерева:
a. Упорядочить ребра графа в порядке возрастания весов. Пусть
w(e1) w(e2) … w(eq).
b. Включить ребро e1 с минимальным весом в строящееся дерево.
c. Для i = 2,3,4…q выполнить: если ребро ei не образует цикла с уже включенными ребрами, включить ребро ei в дерево, иначе – пропустить. Закончить работу, когда будут выбраны p-1 ребер, где p – число вершин в графе.
2) Алгоритм Дейкстры-Прима построения минимального остовного дерева:
a. Выбрать произвольную вершину и считать ее ребром нулевой длины.
b. Упорядочить ребра графа в порядке возрастания весов. Пусть:
= w(e1) < w(e2) … w(eq).
с. Включить ребро с минимальным нулевым весом в строящееся дерево.
d. Включить в дерево ребро ei минимального веса, образующее связный граф без циклов с уже включенными ребрами. Исключить из дальнейшего рассмотрения всякое просмотренное ребро e, образующее цикл с уже включенными ребрами. Повторять шаг 4 до тех пор, пока не будут выбраны p – 1 ребер ненулевого веса.
4.6 Задача о кратчайшем пути и алгоритм Дейкстры для ее решения
Пусть дан ориентированный граф, дугам которого приписаны веса. Задача о нахождении кратчайшего пути состоит в нахождении кратчайшего пути от заданной начальной вершины до заданной конечной вершины, при условии, что такой путь существует. Длиной пути называется сумма длин дуг, составляющих этот путь.
Задача о кратчайшем пути формулируется следующим образом:
1). Найти длины кратчайших путей и сами пути от фиксированной вершины s до всех остальных вершин.
2). Найти длины кратчайших путей и сами пути между всеми парами вершин данного графа.
Алгоритм Дейкстры работает с дугами положительной длины и определяет кратчайшие пути от вершины s до любой другой вершины. Если в графе имеются дуги отрицательной длины (направление обратное направлению движения от точки s к искомой вершине), то задача не имеет смысла. Любой кратчайший путь – это простая цепь.
Вершина v1 будет называться лежащей ближе к вершине s, чем вершина v2, если длина кратчайшего пути от s до v1 меньше, чем длина кратчайшего пути от s до v2.
Технически действия по алгоритму Дейкстры осуществляются при помощи аппарата меток. Метка вершины обозначается d(v). Всякая метка – это число, равное длине пути от s до v. Метки делятся на временные и постоянные. На каждом шаге только одна метка становится постоянной. Это означает, что ее значение равно длине кратчайшего пути до соответствующей вершины, а сама вершина упорядочивается.
1 шаг. Положить d(s) = 0 и считать эту метку постоянной. Положить d(vi) = и считать эти метки временными. Положить p = s.
2 шаг (повторяется пока не будут упорядочены все вершины графа). Пересчитать временную метку d(vi) всякой неупорядоченной вершины vi, в которую входит дуга, выходящая из вершины p по правилу:
d (vi) = min (d (vi); d (p) + l (p, vi)).
Выбрать вершину с минимальной временной меткой и считать эту метку постоянной. Если таких вершин несколько, то выбрать любую.
4.7. Дерево кратчайших путей
Дерево кратчайших путей с корнем в s есть ориентированный подграф, в котором:
1) множество вершин графа достижимы из вершины s
2) граф является деревом с корнем в s
3) для каждой вершины v путь из s в v является кратчайшим.
Иногда веса ребер могут быть отрицательными. При этом важно, есть ли циклы отрицательного веса. Если из вершины s можно добраться до цикла отрицательного веса, то потом можно обходить этот цикл сколь угодно долго, и вес будет всё уменьшаться, так что для вершин этого цикла кратчайших путей не существует. В таком случае можно считать, что вес кратчайшего пути есть −∞. Если же циклов отрицательного веса нет, то любой цикл можно выбросить, не удлиняя пути. Путей без циклов конечное число, так что вес кратчайшего пути корректно определен.
Алгоритм Беллмана решения задачи о кратчайшем пути:
Алгоритм определяет длины кратчайших путей от фиксированной вершины s до всех остальных вершин графа. Он корректно работает даже с отрицательными длинами дуг и в случае присутствия контуров отрицательной длины, обнаруживает его и сообщает о невозможности построения кратчайших путей.
Обозначим
через
длину пути от вершины s
до вершины vi,
кратчайшего из всех путей от s
до vi,
в которых не более k
дуг. Тогда:
Здесь
- длина пути от вершины s
до vi,
через вершину vj.
Алгоритм может окончить работу быстрее, чем за n шагов. Если все числа, найденные на k+1 шаге повторяют числа, найденные на предыдущем шаге, то это и есть минимальные пути и алгоритм заканчивает свою работу.
