SlideShare a Scribd company logo
1 of 28
Download to read offline
Лекция 10:
Остовные деревья
Курносов Михаил Георгиевич
к.т.н. доцент Кафедры вычислительных систем
Сибирский государственный университет
телекоммуникаций и информатики
http://www.mkurnosov.net
Контроль
2
1. Какова сложность по памяти алгоритма Дейкстры при
использовании матрицы смежности и двоичной кучи?
2. Какова сложность по памяти алгоритма Дейкстры при
использовании списков смежности и двоичной кучи?
Остовные деревья
3
О́ стовное дерево связного графа (Spanning tree) –
это ациклический связный подграф (дерево),
в который входят все вершины данного графа
3
1
2
3
4
5
Синонимы: остов, покрывающее дерево, скелет
1
2
3
4
5
Цикл!
Это не остов!
Остовные деревья минимальной стоимости
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
О́ стовное дерево минимальной стоимости
(Minimum spanning tree, MST) – это остовное дерево
с минимальной суммой весов его ребер
Практическое применение:
o Формирование дерева для широковещательной
рассылки информации в сети (tree for broadcasting)
o прокладка TV-кабеля между домами (вес ребер –
стоимость прокладки кабеля между парой домов)
o Spanning Tree Protocol в телекоммуникационных
сетях стандарта Ethernet для предотвращения
образования циклов в сети
o … 5
Алгоритмы построения MST
6
Алгоритм
Вычислительная сложность
Матрица
смежности
Списки
смежности +
двоичная куча
Списки
смежности +
фибоначчиева
куча
Крускала
(J. Kruskal, 1956)
O(|E|log|V|)
Прима
(V. Jarník, 1930;
R. Prim, 1957;
E. Dijkstra, 1959)
O(|V|2) O((|V| + |E|)log|V|) O(|E| + |V|log|V|)
Борувки
(O. Borůvka, 1926)
O(|E|log|V|)
(B. Chazelle,
2000)
O(|E|·α(|E|, |V|)),
где α(m, n) – обратная функция Аккермана
АТД “Система непересекающихся множеств”
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)
АТД “Система непересекающихся множеств”
8
MakeSet(1)
MakeSet(4)
MakeSet(6)
MakeSet(3)
{1}, {4}, {6}, {3}
UnionSets(1, 3)
{1, 3}, {4}, {6}
UnionSets(4, 3)
{1, 3, 4}, {6}
Алгоритм Крускала (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 компонент
связности
Алгоритм Крускала (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).
Алгоритм Крускала (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
продолжение на след. слайде…
Алгоритм Крускала (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
Алгоритм Крускала (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|)
Алгоритм Крускала (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| раз
/* 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
struct mfset *mfset_create(int nelems)
{
struct mfset *p;
int i;
p = malloc(sizeof(*p));
p->nelems = nelems;
p->nsets = 0;
p->sets = malloc(sizeof(struct set) * nelems);
p->elems = malloc(sizeof(struct elem) * nelems);
for (i = 0; i < nelems; i++) {
p->sets[i].size = 0;
p->sets[i].first = -1;
p->elems[i].set = -1;
p->elems[i].next = -1;
}
return p;
}
MFSET
16Tmakeset = O(nelems)
void mfset_free(struct mfset *set)
{
free(set->sets);
free(set->elems);
free(set);
}
void mfset_makeset(struct mfset *set,
int elem)
{
set->sets[set->nsets].size = 1;
set->sets[set->nsets].first = elem;
set->elems[elem].set = set->nsets;
set->elems[elem].next = -1;
set->nsets++;
}
MFSET
17Tmakeset = O(1)
MFSET
18
int mfset_findset(struct mfset *set,
int elem)
{
return set->elems[elem].set;
}
Tfind = O(1)
void mfset_union(struct mfset *set,
int elem1, int elem2)
{
int temp, i, set1, set2;
set1 = mfset_findset(set, elem1);
set2 = mfset_findset(set, elem2);
if (set->sets[set1].size <
set->sets[set2].size)
{
temp = set1;
set1 = set2;
set2 = temp;
}
MFSET
19
/* S1 > S2; Merge elems of S2 to S1 */
i = set->sets[set2].first;
while (set->elems[i].next != -1) {
set->elems[i].set = set1;
i = set->elems[i].next;
}
/* Add elems of S1 to the end of S2 */
set->elems[i].set = set1;
set->elems[i].next = set->sets[set1].first;
set->sets[set1].first = set->sets[set2].first;
set->sets[set1].size += set->sets[set2].size;
/* Remove S2 */
set->sets[set2].size = 0;
set->sets[set2].first = -1;
set->nsets--;
}
MFSET
20Tunion = O(n)
int search_mst_kruskal(struct graph *g,
struct graph *mst)
{
struct mfset *set;
struct heap *pq;
struct heapvalue edge;
struct heapitem item;
int mstlen, i, j, n, w, s1, s2;
n = g->nvertices;
mstlen = 0;
/* Create forest - N sets */
set = mfset_create(n);
for (i = 0; i < n; i++) {
mfset_makeset(set, i);
}
Алгоритм Крускала (Kruskal)
21
/* Insert edges in heap */
pq = heap_create(n * n);
for (i = 0; i < n; i++) {
for (j = i + 1; j < n; j++) {
w = graph_get_edge(g, i + 1,
j + 1);
if (w > 0) {
edge.i = i;
edge.j = j;
heap_insert(pq, w, edge);
}
}
}
Алгоритм Крускала (Kruskal)
22
Алгоритм Крускала (Kruskal)
23
for (i = 0; i < n - 1; ) {
item = heap_removemin(pq);
s1 = mfset_findset(set, item.value.i);
s2 = mfset_findset(set, item.value.j);
if (s1 != s2) {
mfset_union(set, item.value.i,
item.value.j);
mstlen += item.priority;
graph_set_edge(mst, item.value.i + 1,
item.value.j + 1,
item.priority);
i++;
}
}
Алгоритм Крускала (Kruskal)
24
heap_free(pq);
mfset_free(set);
return mstlen;
}
Пример
25
int main()
{
struct graph *g, *mst;
int i, j, mstlen;
g = graph_create(6);
graph_set_edge(g, 1, 2, 6);
graph_set_edge(g, 1, 3, 1);
graph_set_edge(g, 1, 4, 5);
graph_set_edge(g, 2, 3, 5);
graph_set_edge(g, 2, 5, 3);
graph_set_edge(g, 3, 4, 5);
graph_set_edge(g, 3, 5, 6);
graph_set_edge(g, 3, 6, 4);
graph_set_edge(g, 4, 6, 2);
graph_set_edge(g, 5, 6, 6);
6
2
1
4
6
3
5
5
3
6
2
1
5 5
6 4
mst = graph_create(6);
mstlen = search_mst_kruskal(g, mst);
printf("Minimum spanning tree: %dn", mstlen);
for (i = 0; i < 6; i++) {
for (j = 0; j < 6; j++) {
printf("%4d ", graph_get_edge(mst,
i + 1, j + 1));
}
printf("n");
}
graph_free(mst);
graph_free(g);
return 0;
}
Пример
26
Пример
27
$ ./kruskal
Minimum spanning tree: 15
0 0 1 0 0 0
0 0 5 0 3 0
1 5 0 0 0 4
0 0 0 0 0 2
0 3 0 0 0 0
0 0 4 2 0 0
Алгоритм Прима (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

More Related Content

What's hot

Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовMikhail Kurnosov
 
Лекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьЛекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьMikhail Kurnosov
 
Лекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовЛекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовMikhail Kurnosov
 
Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)Mikhail Kurnosov
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиMikhail Kurnosov
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Mikhail Kurnosov
 
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Mikhail Kurnosov
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Mikhail Kurnosov
 
Лекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыЛекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыMikhail Kurnosov
 
Лекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыЛекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыMikhail Kurnosov
 
Лекция 4. Стеки и очереди
Лекция 4. Стеки и очередиЛекция 4. Стеки и очереди
Лекция 4. Стеки и очередиMikhail Kurnosov
 
Лекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмовЛекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмовMikhail Kurnosov
 
Лекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиЛекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиMikhail Kurnosov
 
Лекция 9: Графы. Поиск кратчайшего пути в графе
Лекция 9: Графы. Поиск кратчайшего пути в графеЛекция 9: Графы. Поиск кратчайшего пути в графе
Лекция 9: Графы. Поиск кратчайшего пути в графеMikhail Kurnosov
 
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...Nikolay Grebenshikov
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Mikhail Kurnosov
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Mikhail Kurnosov
 
Лекция №12 "Ограниченная машина Больцмана"
Лекция №12 "Ограниченная машина Больцмана" Лекция №12 "Ограниченная машина Больцмана"
Лекция №12 "Ограниченная машина Больцмана" Technosphere1
 

What's hot (20)

Лекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графовЛекция 8. Графы. Обходы графов
Лекция 8. Графы. Обходы графов
 
Лекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьЛекция 4: Стек. Очередь
Лекция 4: Стек. Очередь
 
Лекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графовЛекция 8: Графы. Обходы графов
Лекция 8: Графы. Обходы графов
 
Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)Лекция 7: Бинарные кучи (пирамиды)
Лекция 7: Бинарные кучи (пирамиды)
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
 
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
Лекция 6. Фибоначчиевы кучи (Fibonacci heaps)
 
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
Лекция 7: Очереди с приоритетами. Бинарные кучи (пирамиды)
 
Векторизация кода (семинар 3)
Векторизация кода (семинар 3)Векторизация кода (семинар 3)
Векторизация кода (семинар 3)
 
Лекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыЛекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмы
 
Лекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмыЛекция 1: Введение в алгоритмы
Лекция 1: Введение в алгоритмы
 
Лекция 4. Стеки и очереди
Лекция 4. Стеки и очередиЛекция 4. Стеки и очереди
Лекция 4. Стеки и очереди
 
графы
графыграфы
графы
 
Лекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмовЛекция 1. Анализ эффективности алгоритмов
Лекция 1. Анализ эффективности алгоритмов
 
Лекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировкиЛекция 2. Алгоритмы сортировки
Лекция 2. Алгоритмы сортировки
 
Лекция 9: Графы. Поиск кратчайшего пути в графе
Лекция 9: Графы. Поиск кратчайшего пути в графеЛекция 9: Графы. Поиск кратчайшего пути в графе
Лекция 9: Графы. Поиск кратчайшего пути в графе
 
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
 
Векторизация кода (семинар 2)
Векторизация кода (семинар 2)Векторизация кода (семинар 2)
Векторизация кода (семинар 2)
 
Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)Лекция 4. Префиксные деревья (tries, prefix trees)
Лекция 4. Префиксные деревья (tries, prefix trees)
 
Лекция №12 "Ограниченная машина Больцмана"
Лекция №12 "Ограниченная машина Больцмана" Лекция №12 "Ограниченная машина Больцмана"
Лекция №12 "Ограниченная машина Больцмана"
 
Оценка сложности алгоритма
Оценка сложности алгоритмаОценка сложности алгоритма
Оценка сложности алгоритма
 

Similar to Лекция 10: Графы. Остовные деревья

Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовТранслируем.бел
 
Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовMikhail Kurnosov
 
Лекция 13: Трудноразрешимые задачи. NP-полнота.
Лекция 13: Трудноразрешимые задачи. NP-полнота.Лекция 13: Трудноразрешимые задачи. NP-полнота.
Лекция 13: Трудноразрешимые задачи. NP-полнота.Mikhail Kurnosov
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиMikhail Kurnosov
 
4. Многомерные массивы и массивы массивов в C#
4. Многомерные массивы и массивы массивов в C#4. Многомерные массивы и массивы массивов в C#
4. Многомерные массивы и массивы массивов в C#Olga Maksimenkova
 
Алгоритмы и структуры данных осень 2013 лекция 4
Алгоритмы и структуры данных осень 2013 лекция 4Алгоритмы и структуры данных осень 2013 лекция 4
Алгоритмы и структуры данных осень 2013 лекция 4Technopark
 
Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).Olga Maksimenkova
 
Лекция №2 "Задача кластеризации и ЕМ-алгоритм"
Лекция №2 "Задача кластеризации и ЕМ-алгоритм"Лекция №2 "Задача кластеризации и ЕМ-алгоритм"
Лекция №2 "Задача кластеризации и ЕМ-алгоритм"Technosphere1
 
презентация
презентацияпрезентация
презентацияLIANA180
 
СИМПЛЕКС-МЕТОД
СИМПЛЕКС-МЕТОДСИМПЛЕКС-МЕТОД
СИМПЛЕКС-МЕТОДIT_1315
 
226329 individualnye kartochki-po_algebre_7_klass
226329 individualnye kartochki-po_algebre_7_klass226329 individualnye kartochki-po_algebre_7_klass
226329 individualnye kartochki-po_algebre_7_klassssusera868ff
 
20100425 model based_testing_kuliamin_lectures01-03
20100425 model based_testing_kuliamin_lectures01-0320100425 model based_testing_kuliamin_lectures01-03
20100425 model based_testing_kuliamin_lectures01-03Computer Science Club
 
нетрадиционный урок математич игра счастливый случай
нетрадиционный урок математич игра счастливый случайнетрадиционный урок математич игра счастливый случай
нетрадиционный урок математич игра счастливый случайoquzaman
 
Python. Объектно-ориентированное программирование
Python. Объектно-ориентированное программирование Python. Объектно-ориентированное программирование
Python. Объектно-ориентированное программирование Theoretical mechanics department
 
Лекция 9: Графы. Кратчайшие пути в графах
Лекция 9: Графы. Кратчайшие пути в графахЛекция 9: Графы. Кратчайшие пути в графах
Лекция 9: Графы. Кратчайшие пути в графахMikhail Kurnosov
 
Советский суперкомпьютер К-340А и секретные вычисления
Советский суперкомпьютер К-340А и секретные вычисленияСоветский суперкомпьютер К-340А и секретные вычисления
Советский суперкомпьютер К-340А и секретные вычисленияPositive Hack Days
 
Разведочный анализ данных: создание графиков в системе R
Разведочный анализ данных: создание графиков в системе RРазведочный анализ данных: создание графиков в системе R
Разведочный анализ данных: создание графиков в системе RSergey Mastitsky
 
78b 1 гдз. алгебра и начала анализа. 10-11кл-11 класс_алимов, колягина_2003 ...
78b 1  гдз. алгебра и начала анализа. 10-11кл-11 класс_алимов, колягина_2003 ...78b 1  гдз. алгебра и начала анализа. 10-11кл-11 класс_алимов, колягина_2003 ...
78b 1 гдз. алгебра и начала анализа. 10-11кл-11 класс_алимов, колягина_2003 ...rosgdz
 

Similar to Лекция 10: Графы. Остовные деревья (20)

Основы MATLAB. Численные методы
Основы MATLAB. Численные методыОсновы MATLAB. Численные методы
Основы MATLAB. Численные методы
 
Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетов
 
Лекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмовЛекция 11: Методы разработки алгоритмов
Лекция 11: Методы разработки алгоритмов
 
Лекция 13: Трудноразрешимые задачи. NP-полнота.
Лекция 13: Трудноразрешимые задачи. NP-полнота.Лекция 13: Трудноразрешимые задачи. NP-полнота.
Лекция 13: Трудноразрешимые задачи. NP-полнота.
 
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировкиЛекция 2: Абстрактные типы данных. Алгоритмы сортировки
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
 
4. Многомерные массивы и массивы массивов в C#
4. Многомерные массивы и массивы массивов в C#4. Многомерные массивы и массивы массивов в C#
4. Многомерные массивы и массивы массивов в C#
 
Алгоритмы и структуры данных осень 2013 лекция 4
Алгоритмы и структуры данных осень 2013 лекция 4Алгоритмы и структуры данных осень 2013 лекция 4
Алгоритмы и структуры данных осень 2013 лекция 4
 
Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).Представление графов в памяти компьютера (c++).
Представление графов в памяти компьютера (c++).
 
Лекция №2 "Задача кластеризации и ЕМ-алгоритм"
Лекция №2 "Задача кластеризации и ЕМ-алгоритм"Лекция №2 "Задача кластеризации и ЕМ-алгоритм"
Лекция №2 "Задача кластеризации и ЕМ-алгоритм"
 
презентация
презентацияпрезентация
презентация
 
Основы SciPy
Основы SciPyОсновы SciPy
Основы SciPy
 
СИМПЛЕКС-МЕТОД
СИМПЛЕКС-МЕТОДСИМПЛЕКС-МЕТОД
СИМПЛЕКС-МЕТОД
 
226329 individualnye kartochki-po_algebre_7_klass
226329 individualnye kartochki-po_algebre_7_klass226329 individualnye kartochki-po_algebre_7_klass
226329 individualnye kartochki-po_algebre_7_klass
 
20100425 model based_testing_kuliamin_lectures01-03
20100425 model based_testing_kuliamin_lectures01-0320100425 model based_testing_kuliamin_lectures01-03
20100425 model based_testing_kuliamin_lectures01-03
 
нетрадиционный урок математич игра счастливый случай
нетрадиционный урок математич игра счастливый случайнетрадиционный урок математич игра счастливый случай
нетрадиционный урок математич игра счастливый случай
 
Python. Объектно-ориентированное программирование
Python. Объектно-ориентированное программирование Python. Объектно-ориентированное программирование
Python. Объектно-ориентированное программирование
 
Лекция 9: Графы. Кратчайшие пути в графах
Лекция 9: Графы. Кратчайшие пути в графахЛекция 9: Графы. Кратчайшие пути в графах
Лекция 9: Графы. Кратчайшие пути в графах
 
Советский суперкомпьютер К-340А и секретные вычисления
Советский суперкомпьютер К-340А и секретные вычисленияСоветский суперкомпьютер К-340А и секретные вычисления
Советский суперкомпьютер К-340А и секретные вычисления
 
Разведочный анализ данных: создание графиков в системе R
Разведочный анализ данных: создание графиков в системе RРазведочный анализ данных: создание графиков в системе R
Разведочный анализ данных: создание графиков в системе R
 
78b 1 гдз. алгебра и начала анализа. 10-11кл-11 класс_алимов, колягина_2003 ...
78b 1  гдз. алгебра и начала анализа. 10-11кл-11 класс_алимов, колягина_2003 ...78b 1  гдз. алгебра и начала анализа. 10-11кл-11 класс_алимов, колягина_2003 ...
78b 1 гдз. алгебра и начала анализа. 10-11кл-11 класс_алимов, колягина_2003 ...
 

More from Mikhail Kurnosov

Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Mikhail Kurnosov
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Mikhail Kurnosov
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPMikhail Kurnosov
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Mikhail Kurnosov
 
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Mikhail Kurnosov
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Mikhail Kurnosov
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Mikhail Kurnosov
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Mikhail Kurnosov
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Mikhail Kurnosov
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Mikhail Kurnosov
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Mikhail Kurnosov
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Mikhail Kurnosov
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Mikhail Kurnosov
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Mikhail Kurnosov
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Mikhail Kurnosov
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Mikhail Kurnosov
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Mikhail Kurnosov
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Mikhail Kurnosov
 
Лекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыЛекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыMikhail Kurnosov
 
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Mikhail Kurnosov
 

More from Mikhail Kurnosov (20)

Векторизация кода (семинар 1)
Векторизация кода (семинар 1)Векторизация кода (семинар 1)
Векторизация кода (семинар 1)
 
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
Лекция 7. Декартовы деревья (Treaps, дучи, дерамиды)
 
Лекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMPЛекция 6. Стандарт OpenMP
Лекция 6. Стандарт OpenMP
 
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
Лекция 5. Основы параллельного программирования (Speedup, Amdahl's law, Paral...
 
Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)Лекция 5. B-деревья (B-trees, k-way merge sort)
Лекция 5. B-деревья (B-trees, k-way merge sort)
 
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
Лекция 4. Векторизация кода (Code vectorization: SSE, AVX)
 
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
Лекция 3. Оптимизация доступа к памяти (Memory access optimization, cache opt...
 
Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)Лекция 3. АВЛ-деревья (AVL trees)
Лекция 3. АВЛ-деревья (AVL trees)
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
 
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
Лекция 2. Красно-чёрные деревья (Red-black trees). Скошенные деревья (Splay t...
 
Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)Лекция 1. Амортизационный анализ (amortized analysis)
Лекция 1. Амортизационный анализ (amortized analysis)
 
Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)Семинар 12. Параллельное программирование на MPI (часть 5)
Семинар 12. Параллельное программирование на MPI (часть 5)
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
 
Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)Семинар 10. Параллельное программирование на MPI (часть 3)
Семинар 10. Параллельное программирование на MPI (часть 3)
 
Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)Семинар 9. Параллельное программирование на MPI (часть 2)
Семинар 9. Параллельное программирование на MPI (часть 2)
 
Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)Семинар 8. Параллельное программирование на MPI (часть 1)
Семинар 8. Параллельное программирование на MPI (часть 1)
 
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
 
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)Семинар 6. Многопоточное программирование на OpenMP (часть 6)
Семинар 6. Многопоточное программирование на OpenMP (часть 6)
 
Лекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицыЛекция 6. Хеш-таблицы
Лекция 6. Хеш-таблицы
 
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 5. Многопоточное программирование на OpenMP (часть 5)Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Семинар 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
  • 6. Алгоритмы построения MST 6 Алгоритм Вычислительная сложность Матрица смежности Списки смежности + двоичная куча Списки смежности + фибоначчиева куча Крускала (J. Kruskal, 1956) O(|E|log|V|) Прима (V. Jarník, 1930; R. Prim, 1957; E. Dijkstra, 1959) O(|V|2) O((|V| + |E|)log|V|) O(|E| + |V|log|V|) Борувки (O. Borůvka, 1926) O(|E|log|V|) (B. Chazelle, 2000) O(|E|·α(|E|, |V|)), где α(m, n) – обратная функция Аккермана
  • 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)
  • 8. АТД “Система непересекающихся множеств” 8 MakeSet(1) MakeSet(4) MakeSet(6) MakeSet(3) {1}, {4}, {6}, {3} UnionSets(1, 3) {1, 3}, {4}, {6} UnionSets(4, 3) {1, 3, 4}, {6}
  • 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
  • 16. struct mfset *mfset_create(int nelems) { struct mfset *p; int i; p = malloc(sizeof(*p)); p->nelems = nelems; p->nsets = 0; p->sets = malloc(sizeof(struct set) * nelems); p->elems = malloc(sizeof(struct elem) * nelems); for (i = 0; i < nelems; i++) { p->sets[i].size = 0; p->sets[i].first = -1; p->elems[i].set = -1; p->elems[i].next = -1; } return p; } MFSET 16Tmakeset = O(nelems)
  • 17. void mfset_free(struct mfset *set) { free(set->sets); free(set->elems); free(set); } void mfset_makeset(struct mfset *set, int elem) { set->sets[set->nsets].size = 1; set->sets[set->nsets].first = elem; set->elems[elem].set = set->nsets; set->elems[elem].next = -1; set->nsets++; } MFSET 17Tmakeset = O(1)
  • 18. MFSET 18 int mfset_findset(struct mfset *set, int elem) { return set->elems[elem].set; } Tfind = O(1)
  • 19. void mfset_union(struct mfset *set, int elem1, int elem2) { int temp, i, set1, set2; set1 = mfset_findset(set, elem1); set2 = mfset_findset(set, elem2); if (set->sets[set1].size < set->sets[set2].size) { temp = set1; set1 = set2; set2 = temp; } MFSET 19
  • 20. /* S1 > S2; Merge elems of S2 to S1 */ i = set->sets[set2].first; while (set->elems[i].next != -1) { set->elems[i].set = set1; i = set->elems[i].next; } /* Add elems of S1 to the end of S2 */ set->elems[i].set = set1; set->elems[i].next = set->sets[set1].first; set->sets[set1].first = set->sets[set2].first; set->sets[set1].size += set->sets[set2].size; /* Remove S2 */ set->sets[set2].size = 0; set->sets[set2].first = -1; set->nsets--; } MFSET 20Tunion = O(n)
  • 21. int search_mst_kruskal(struct graph *g, struct graph *mst) { struct mfset *set; struct heap *pq; struct heapvalue edge; struct heapitem item; int mstlen, i, j, n, w, s1, s2; n = g->nvertices; mstlen = 0; /* Create forest - N sets */ set = mfset_create(n); for (i = 0; i < n; i++) { mfset_makeset(set, i); } Алгоритм Крускала (Kruskal) 21
  • 22. /* Insert edges in heap */ pq = heap_create(n * n); for (i = 0; i < n; i++) { for (j = i + 1; j < n; j++) { w = graph_get_edge(g, i + 1, j + 1); if (w > 0) { edge.i = i; edge.j = j; heap_insert(pq, w, edge); } } } Алгоритм Крускала (Kruskal) 22
  • 23. Алгоритм Крускала (Kruskal) 23 for (i = 0; i < n - 1; ) { item = heap_removemin(pq); s1 = mfset_findset(set, item.value.i); s2 = mfset_findset(set, item.value.j); if (s1 != s2) { mfset_union(set, item.value.i, item.value.j); mstlen += item.priority; graph_set_edge(mst, item.value.i + 1, item.value.j + 1, item.priority); i++; } }
  • 25. Пример 25 int main() { struct graph *g, *mst; int i, j, mstlen; g = graph_create(6); graph_set_edge(g, 1, 2, 6); graph_set_edge(g, 1, 3, 1); graph_set_edge(g, 1, 4, 5); graph_set_edge(g, 2, 3, 5); graph_set_edge(g, 2, 5, 3); graph_set_edge(g, 3, 4, 5); graph_set_edge(g, 3, 5, 6); graph_set_edge(g, 3, 6, 4); graph_set_edge(g, 4, 6, 2); graph_set_edge(g, 5, 6, 6); 6 2 1 4 6 3 5 5 3 6 2 1 5 5 6 4
  • 26. mst = graph_create(6); mstlen = search_mst_kruskal(g, mst); printf("Minimum spanning tree: %dn", mstlen); for (i = 0; i < 6; i++) { for (j = 0; j < 6; j++) { printf("%4d ", graph_get_edge(mst, i + 1, j + 1)); } printf("n"); } graph_free(mst); graph_free(g); return 0; } Пример 26
  • 27. Пример 27 $ ./kruskal Minimum spanning tree: 15 0 0 1 0 0 0 0 0 5 0 3 0 1 5 0 0 0 4 0 0 0 0 0 2 0 3 0 0 0 0 0 0 4 2 0 0
  • 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