Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Графы_доп.doc
Скачиваний:
49
Добавлен:
11.05.2015
Размер:
502.27 Кб
Скачать
      1. Алгоритмы на графах

        1. Алгоритмы обхода графов в глубину и по уровням

При работе с графами часто приходится выполнять какое-либо действие по одному разу с каждой из вершин графа. Например, некоторую порцию информации следует передать каждому компьютеру в сети. Подобный обход можно совершать двумя различными способами. При обходе в глубину проход по выбранному пути осуществляется настолько глубоко, насколько это возможно, а при обходе по уровням мы равномерно двигаемся вдоль всех возможных направлений

          1. Обход в глубину

При обходе в глубину посещается первый узел, а затем происходит перемещение вдоль ребер графа до тех пор, пока не встретится тупик. Узел неориентированного графа является тупиком, если все примыкающие к нему узлы уже были посещены. В орграфе тупиком также называется узел, из которого нет выходящих ребер. После попадания в тупик необходимо передвигаться назад вдоль пройденного пути до тех пор, пока не будет обнаружена вершина, у которой есть еще не посещенный сосед, и затем двигаться в этом новом направлении. Процесс оказывается завершенным, когда произошел возврат в отправную точку, и все примыкающие к ней вершины уже были посещены.

Рекурсивный алгоритм обхода в глубину приведен ниже:

DepthFirstTraversal(G,v)

G - граф

v - текущий узел

Visit(v)

Mark(v)

for каждогоребраvwграфаG do

if вершинаwнепомеченаthen

DepthFirstTraversal(G,w)

end if

end for

Этот рекурсивный алгоритм использует системный стек для отслеживания текущей вершины графа, что позволяет правильно осуществить возвращение, наткнувшись на тупик. Можно построить нерекурсивный алгоритм, воспользовавшись стеком для сохранения и удаления информации о пройденных вершинах.

          1. Обход по уровням

При обходе по уровням после посещения первого узла посещаются все соседние с ним вершины. При втором проходе посещаются все вершины, находящиеся на расстоянии двух ребер от начальной. При каждом новом проходе обходятся все вершины, расстояние от которых до начальной на единицу больше предыдущего. Для предупреждения повторного посещения необходимо либо вести список посещенных вершин, либо хранить информацию о посещении в соответствующей структуре данных узла. Ниже приведен пример реализации алгоритма обхода по уровням:

BreadthFirstTraversal(G,v)

G граф

v текущий узел

Visit(v)

Mark(v)

Enqueue(v)

while очередь непуста do

Dequeue(x)

for каждого ребра xw в графе G do

if вершинаwнепомеченаthen

Visit(w)

Mark(w)

Enqueue(w)

end if

end for

end while

Этот алгоритм заносит в очередь корень дерева обхода по уровням, но затем немедленно удаляет его из очереди. При просмотре соседних с корнем вершин он заносит их в очередь. После посещения всех соседних с корнем вершин происходит возвращение к очереди и обращение к первой вершине оттуда. Поскольку узлы добавляются к концу очереди, ни одна из вершин, находящихся на расстоянии двух ребер от корня, не будет рассмотрена повторно, пока не будут обработаны и удалены из очереди все вершины на расстоянии одного ребра от корня.

        1. Алгоритмы поиска минимального остовного дерева

Минимальным остовным деревом (МОД) связного взвешенного графа называется его связный подграф, состоящий из всех вершин исходного графа и некоторых его ребер, причем сумма весов ребер является минимально возможной. Такое дерево может понадобиться, например, для организации компьютерной сети.