- •Теоретические положения
- •1.1. Деревья. Основные понятия
- •1.2. Реализация деревьев
- •1.3. Авл-деревья
- •1.4. В-деревья
- •1.5. Алгоритмы на графах
- •2. Задания к лабораторному практикуму
- •2.3. Лабораторная работа №3 «Программирование алгоритмов реализации и обработки графов»
- •3. Содержание отчета
- •Приложение
- •Нелинейные структуры данных
1.5. Алгоритмы на графах
С формальной точки зрения граф представляет собой упорядоченную пару G = (V, E) множеств, первое из которых состоит из вершин или узлов графа, а второе – из его ребер. Ребро связывает между собой две примыкающие друг к другу (соседние) вершины и часто обозначается этой парой вершин. Графы бывают ориентированными (орграфами) и неориентированными. В орграфе ребро представляет собой упорядоченную пару вершин – начало и конец, в неориентированном графе – неупорядоченную пару вершин, его концов. Путь в графе или орграфе – последовательность ребер, по которым можно поочередно проходить. Во взвешенном графе каждому ребру приписано число, называемое весом ребра. Граф называется связным, если всякую пару узлов можно соединить по крайней мере одним путем. Цикл – это путь, который начинается и заканчивается в одной и той же вершине. Более подробно с терминологией можно ознакомиться в [4]. При работе с графами часто приходится выполнять некоторое действие по одному разу с каждой вершиной графа. Подобный обход может быть выполнен двумя способами – в глубину или по уровням. В обоих случаях одна из вершин графа выбирается в качестве отправной точки.
Обход в глубину
При обходе в глубину посещается первый узел, а затем происходит перемещение вдоль ребер графа до тех пор, пока не встретится тупик. Узел неориентированного графа является тупиком, если все примыкающие к нему узлы уже были посещены. В орграфе тупиком также называется узел, из которого нет выходящих ребер. После попадания в тупик необходимо передвигаться назад вдоль пройденного пути до тех пор, пока не будет обнаружена вершина, у которой есть еще не посещенный сосед, и затем двигаться в этом новом направлении. Процесс оказывается завершенным, когда произошел возврат в отправную точку и все примыкающие к ней вершины уже были посещены.
Обход по уровням
При обходе по уровням после посещения первого узла посещаются все соседние с ним вершины. При втором проходе посещаются все вершины, находящиеся на расстоянии двух ребер от начальной. При каждом новом проходе обходятся все вершины, расстояние от которых до начальной на единицу больше предыдущего. Для предупреждения повторного посещения необходимо либо вести список посещенных вершин, либо хранить информацию о посещении в соответствующей структуре данных узла.
Алгоритмы поиска минимального остовного дерева
Минимальным остовным деревом (МОД) связного взвешенного графа называется его связный подграф, состоящий из всех вершин исходного графа и некоторых его ребер, причем сумма весов ребер является минимально возможной. Такое дерево может понадобиться, например, для организации компьютерной сети.
Дейкстра и Прим предложили так называемый «жадный» алгоритм построения МОД. «Жадные» алгоритмы действуют, используя в каждый момент часть исходных данных и принимая лучшее решение на основе этой части. В рассматриваемом случае на каждом шаге имеется множество ребер, которые могут быть присоединены к уже построенной части остовного дерева, из них выбирается ребро с наименьшим весом. Вершины графа разбиваются на три класса: вершины, вошедшие в уже построенную часть дерева, вершины, окаймляющие построенную часть, и еще не рассмотренные вершины. Алгоритм начинает работу с произвольной вершины графа, которая включается в остовное дерево. Все вершины, соединенные (соседние) с данной, заносятся в кайму. Затем выполняется цикл поиска ребра с наименьшим весом, соединяющего уже построенную часть остовного дерева с каймой; это ребро вместе с новой вершиной добавляется в дерево и происходит обновление каймы таким образом, чтобы список ребер из дерева в кайму включал ребра с наименьшими весами. После того, как в дерево попадут все вершины, работа будет закончена.
Другой алгоритм построения МОД предложил Крускал. Алгоритм начинает работу с пустого дерева. К нему добавляются ребра в порядке возрастания их весов до тех пор, пока не будет получен набор ребер, объединяющий все вершины графа. В процессе выполнения необходимо не допускать добавление ребер, приводящих к появлению цикла в создаваемом дереве. Если ребра закончатся до того, как все вершины будут соединены между собой, это означает, что граф был несвязным, и полученный результат представляет собой объединение МОД всех его компонент связности [4].
