Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Лекция 10: Графы. Остовные деревья
1. Лекция 10:
Остовные деревья
Курносов Михаил Георгиевич
к.т.н. доцент Кафедры вычислительных систем
Сибирский государственный университет
телекоммуникаций и информатики
http://www.mkurnosov.net
2. Контроль
2
1. Какова сложность по памяти алгоритма Дейкстры при
использовании матрицы смежности и двоичной кучи?
2. Какова сложность по памяти алгоритма Дейкстры при
использовании списков смежности и двоичной кучи?
3. Остовные деревья
3
О́ стовное дерево связного графа (Spanning tree) –
это ациклический связный подграф (дерево),
в который входят все вершины данного графа
3
1
2
3
4
5
Синонимы: остов, покрывающее дерево, скелет
1
2
3
4
5
Цикл!
Это не остов!
4. Остовные деревья минимальной стоимости
4
Если граф взвешенный, то рассматривается задача
о нахождении остовного дерева с минимальной
суммой весов входящих в него рёбер
4
1
2
5
3
4
100
10
30
50
10
20
60
1
2
5
3
4
100
10
30
50
10
20
60
Cost = 10 + 50 + 10 + 60 = 130 Cost = 100 + 10 + 50 + 20 = 180
5. Остовные деревья минимальной стоимости
5
О́ стовное дерево минимальной стоимости
(Minimum spanning tree, MST) – это остовное дерево
с минимальной суммой весов его ребер
Практическое применение:
o Формирование дерева для широковещательной
рассылки информации в сети (tree for broadcasting)
o прокладка TV-кабеля между домами (вес ребер –
стоимость прокладки кабеля между парой домов)
o Spanning Tree Protocol в телекоммуникационных
сетях стандарта Ethernet для предотвращения
образования циклов в сети
o … 5
7. АТД “Система непересекающихся множеств”
7
Система непересекающихся множеств
(Disjoint-set data structure) – это структура данных
для представления непересекающихся множеств.
Поддерживает следующие операции:
o MakeSet(i) – создает множество из одного элемента i
o FindSet(i) – возвращает множество (его номер),
содержащее элемент i
o UnionSets(i, j) – объединяет множества, содержащие
элементы i и j
Реализация: (Aho, С. 169, MFSET), (Levitin, С. 381), (Cormen, С. 582)
9. Алгоритм Крускала (Kruskal)
9
6
2
1
4
6
3
5
5
3
6
2
1
5 5
6 4
1. Создается пустой граф T из n вершин,
несвязанных ребрами
2. Все ребра исходного графа G
помещают в очередь с приоритетом
Приоритет – вес ребра wij
(ребра упорядочиваются по
неубыванию весов – min heap)
G
2
1
4
6
3
5
T
Prio. Q: (1, 3), (4, 6), (2, 5), (3, 6), (2, 3), …
В графе T 6 компонент
связности
10. Алгоритм Крускала (Kruskal)
10
6
2
1
4
6
3
5
5
3
6
2
1
5 5
6 4
3. Цикл из n – 1 итерации (по количеству
ребер в MST).
a) Из очереди извлекается ребро
(i, j) с минимальным весом
(HeapDeleteMin)
b) Если ребро (i, j) связывает
вершины из разных компонент
связности графа T, то ребро
добавляется в граф T
G
2
1
4
6
3
5
T
Q: (1, 3), (4, 6), (2, 5), (3, 6), (2, 3), …
Последовательность добавление ребер
в граф T: (1, 3), (4, 6), (2, 5), (3, 6), (2, 3).
11. Алгоритм Крускала (Kruskal)
11
function Kruskal(G)
/* Input: G = (V, E) */
/* Output: T = (V, E’) */
for each i in V do
MakeSet(i)
end for
for each (i, j) in E do
PQueueInsert(w[i][j], (i, j))
end for
C = |V| /* Кол-во компонент связности */
Помещаем каждую
вершину i в отдельное
множество – компоненту
связности графа T
продолжение на след. слайде…
12. Алгоритм Крускала (Kruskal)
12
while C > 1 do
(i, j) = PQueueRemoveMin()
A = FindSet(i)
B = FindSet(j)
if A != B then
UnionSets(i, j)
GraphAddEdge(T, (i, j))
C = C - 1
end if
end for
end function
По номеру вершины
определяем компоненту
связности графа T
Объединяем
компоненты
связности
вершин i и j
13. Алгоритм Крускала (Kruskal)
13
function Kruskal(G)
/* Input: G = (V, E) */
/* Output: T = (V, E’) */
for each i in V do
MakeSet(i)
end for
for each (i, j) in E do
PQueueInsert(w[i][j], (i, j))
end for
C = |V| /* Кол-во компонент связности */
продолжение на след. слайде…
O(|V|)
O(|E|·log|E|)
14. Алгоритм Крускала (Kruskal)
14
while C > 1 do
(i, j) = PQueueRemoveMin()
A = FindSet(i)
B = FindSet(j)
if A != B then
UnionSets(i, j)
GraphAddEdge(T, (i, j))
C = C - 1
end if
end for
end function
O(log|E|)
В худшем случае цикл
выполняется |E| раз
15. /* mfset.h: Disjoint set data structure */
struct set {
int size;
int first;
};
struct elem {
int set;
int next;
};
struct mfset {
struct set *sets;
struct elem *elems;
int nelems;
int nsets;
};
MFSET
15elems
sets
28. Алгоритм Прима (Prim)
28
6
2
1
4
6
3
5
5
3
6
2
1
5 5
6 4
1. Создается пустой граф T.
2. Во множество U помещается
вершина 1, с которой начнется
формирование остова.
3. Цикл пока U ≠ V
a) Найти ребро (i, j) с наименьшим
весом такое, что i ∈ U и j ∈ V
b) Добавить ребро (i, j) в граф T
c) Добавить вершину j
во множество U
G
2
1
4
6
3
5
T