Скачиваний:
23
Добавлен:
02.05.2014
Размер:
259.58 Кб
Скачать

Деревья и циклы

Граф G называется деревом, если он является связным и не имеет циклов. Граф G называется лесом, если все его компоненты связности - деревья.

Деревья обладают следующими свойствами:

1) Граф G есть дерево.

2) Граф G является связным и не имеет простых циклов.

3) Граф G является связным и число его ребер ровно на 1 меньше числа вершин.

4)  две различные вершины графа G можно соединить единственной (и при этом простой) цепью.

5) Граф G не содержит циклов, но, добавляя к нему любое новое ребро, получаем ровно один и притом простой цикл.

Если у дерева G имеется, по крайней мере, 1 ребро, то у него найдется висячая вершина.

Предположим, что в графе G нет висячей вершины, тогда найдется цикл (в начале лекции это было доказано), тогда граф - не дерево.

Пусть G связный граф, а висячая вершина вG, граф получается из G в результате удаления вершины и инцидентного ей ребра. Тогда тоже является связным.

Пусть G - дерево с n-вершинами и m-ребрами. Тогда m(G)=n(G)-1.

Если m<n-1 то граф не связный.

Если m>n-1, и висячих вершин в графе нет, то можно выделить цикл, а следовательно, это – не дерево. В противном случае удалим висячую вершину вместе с инцидентным ей ребром. Повторяя эту операцию n-2 раза, придем к графу с двумя вершинами и более чем одним ребром  это не дерево.

Пусть G – дерево. Тогда любая цепь в G будет простой.

Если цепь – не простая, то в G есть циклы  G – не дерево.

Цепь единственна по той же причине.

Остовным деревом связного графа G называется любой его подграф, содержащий все вершины графа G и являющийся деревом.

Пусть G – связный граф. Тогда остовное дерево графа G должно содержать n(G)-1 ребер. Значит, для получения остовного дерева из графа G нужно удалить ребер. Числоназывается цикломатическим числом графаG.

Алгоритм выделения остовного дерева

1) Выберем в G произвольную вершину , которая образует подграф, являющийся деревом. Положим i=1.

2) Если i=n(G), то задача решена и Gi – искомое остовное дерево графа G. Иначе переходим к п. 3.

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

Присваиваем i:=i+1 и переходим к шагу 2).

Замечание. Остовное дерево может быть выделено, вообще говоря, не единственным способом.

Если граф – нагруженный, то можно выделить остовное дерево с минимальной суммой длин содержащихся в нем ребер.

Алгоритм выделения минимального остовного дерева нагруженного графа.

Существует 2 алгоритма для выделения минимального остовного дерева в нагруженном графе: алгоритм Прима и алгоритм Краскала.

Алгоритм Краскала

Идея алгоритма. Искомые ребра соединяют вершины. Поэтому возможны две стратегии построения. Можно идти от вершин и для каждой из них искать минимальное ребро (как это сделано в алгоритме Прима) а можно для каждого ребра выяснять можно ли его включить в строящееся дерево. Алгоритм Краскала предлагает делать это следующим образом. Во-первых, ребра графа пронумеровываем в порядке возрастания весов. Затем для каждого ребра начиная с первого проверяем соединяет или нет оно две несвязные вершины, если да, то его можно включить в остовное дерево. Ясно, что если мы имеем V вершин, то работа алгоритма начинается с V несвязных компонент графа (пока из графа все ребра исключаем). Для того, чтобы их связать необходимо найти V-1 ребро.

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

Алгоритм.

  • Создаем список ребер по возрастанию.

  • Создаем множество компонент связности, каждая из которых содержит ровно одну вершину.

  • Пока компонент связности больше чем одна.

    • Взять ребро из начала списка ребер.

    • Если ребро соединяет две разных компоненты связности то

      • Компоненты связности объединить в одну.

Алгоритм Прима

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

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

Алгоритм.

  • Множество остовных вершин – исходная веришны

  • Множество оставшихся - все вершины за исключением исходной.

  • Пока множество оставшихся не пусто

    • Ищем ребро соединяющее множество остовных и множество оставшихся и имеющее наименьший вес.

    • Для найденного ребра, вершину принадлежащую множеству оставшихся:

      • Вычеркиваем из множества оставшихся.

      • Добавляем к множеству остовных.

Соседние файлы в папке Курсовая работа - Выделение минимального остовного дерева