Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конспект лекций СиАОД.docx
Скачиваний:
9
Добавлен:
01.03.2025
Размер:
4.62 Mб
Скачать
      1. Алгоритм Крускала

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

Пусть (u,v) - такое ребро, соединяющее вершины из компонент C1 и C2. Это ребро является легким ребром для разреза (C1,V\ C1), и можно воспользоваться теоремой.

Алгоритм Крускала использует структуры данных для непересекающихся множеств. Элементами множеств являются вершины графа; каждое множество содержит вершины одной связной компоненты.

FIND-SET(u) - возвращает представителя множества, содержащего элемент u.

Процедура UNION выполняет объединение деревьев

MST-KRUSKAL(G,w)

1 A  

2 for (для) каждой вершины vV[G]

3 do MAKE-SET(v)

4 упорядочить ребра E по весам

5for (для) (u,v)  E (в порядке возрастания веса)

6 do if FIND-SET(u)  FIND-SET(v)

7 then AA {(u,v)}

8 UNION (u,v)

9 return A

Оценка времени работы

Инициализация O(V)

Упорядочение ребер (строка 4) – O(E log E)

Далее производится O(E) операций, занимающих в совокупности O(E log E).

Общее время работы алгоритма Крускала O(E log E).

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

В алгоритме Прима растущая часть остова представляет собой дерево (множество ребер которого есть A). Формирование дерева начинается с произвольной корневой вершины r. На каждом шаге добавляется ребро наименьшего веса среди ребер, соединяющих веершины этого дерева с вершинами не из дерева. По следствию добавляемые ребра являются безопасными для A , так что в результате получается минимальный остов.

Алгоритм получает на вход связный граф G и корень r минимального покрывающего дерева. В ходе алгоритма все вершины, еще не попавшие в дерево, хранятся в очереди с приоритетами. Приоритет вершины v определяется значением key[v], которое равно минимальному весу ребер, соединяющих v с вершинами дерева A. (Если таких ребр нет, полагаем key[v] =  ). Поле  [v] для вершин дерева указывает на родителя, а для вершины v Q указывает на вершину дерева, в которую ведет ребро веса key[v].

Множество ребер строящегося дерева явно не хранится; его можно восстановить как

A ={( v,  [v] ): vV \ {r} \ Q }

В конце работы алгоритма очередь Q пуста, а множество

A ={( v,  [v] ): vV \ {r} }

Есть множество ребер покрываюшего дерева

MST-PRIM (G, w, r)

1 QV[G]

2 for (для) каждой вершины uQ

3 do key[u]

4 key[r]0

5  [r] NIL

6 while Q  

7 do u  EXTRACT-MIN(Q)

8 for (для) каждой вершины vAdj[u]

9 do if vQ и w(u,v) < key[v]

10 then  [v] u

11 key[v]  w(u,v)

Оценка времени работы алгоритма Прима

Если для организации очереди Q использовать двоичную кучу, инициализацию в строках 1-4 можно выполнить за время O(V).

Цикл выполняеется Vраз, и каждая операция EXTRACT-MIN занимает время O(log V), всего O(V log V).

Цикл в строках 8-11 выполняется в общей сложности O(E) раз. Проверку принадлежности в строке 9 внутри цикла можно реализовать за O(1).

Присваивание в строке 11 может быть выполнена за время O(log V).

Всего получаем O(V log V + E log V) = O( E log V).