Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет "Структуры и алгоритмы
Лекция 10: Графы. Остовные деревья минимальной...
-
Upload
mikhail-kurnosov -
Category
Technology
-
view
620 -
download
2
Transcript of Лекция 10: Графы. Остовные деревья минимальной...
![Page 1: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/1.jpg)
Лекция 10Остовные деревья
Курносов Михаил Георгиевич
к.т.н. доцент Кафедры вычислительных систем Сибирский государственный университет
телекоммуникаций и информатики
http://www.mkurnosov.net/teaching
![Page 2: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/2.jpg)
Задача
2
Имеется n городов, которые необходимо соединить дорогами, так, чтобы можно было добраться из любого города в любой другой (напрямую или через другие города)
Известна стоимость строительства дороги между любой парой городов(задан взвешенный граф)
Между какими городами строить дороги?
2
87
65
45
140
43
94
98
110
78
49
Новосибирск
Бийск
Томск
Барнаул
Кемерово
![Page 3: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/3.jpg)
Задача
33
87
65
45
140
43
94
98
110
78
49
Новосибирск
Бийск
Томск
Барнаул
Кемерово
Стоимость проекта87 + 65 + 49 + 140 = 341
Имеется n городов, которые необходимо соединить дорогами, так, чтобы можно было добраться из любого города в любой другой (напрямую или через другие города)
Известна стоимость строительства дороги между любой парой городов(задан взвешенный граф)
Между какими городами строить дороги?
![Page 4: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/4.jpg)
Задача
44
87
65
45
140
43
94
98
110
78
49
Новосибирск
Бийск
Томск
Барнаул
Кемерово
Стоимость проекта65 + 49 + 140 + 43 = 297
Имеется n городов, которые необходимо соединить дорогами, так, чтобы можно было добраться из любого города в любой другой (напрямую или через другие города)
Известна стоимость строительства дороги между любой парой городов(задан взвешенный граф)
Между какими городами строить дороги?
![Page 5: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/5.jpg)
Остовные деревья
5
О́стовное дерево связного графа (Spanning tree) –это ациклический связный подграф (дерево), в который входят все вершины данного графа
5
1
2
3
4
5
Синонимы: остов, покрывающее дерево, скелет графа
1
2
3
4
5
Это не остов –присутствует
цикл
![Page 6: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/6.jpg)
Остовные деревья минимальной стоимости
6
Если граф взвешенный, то рассматривается задача о нахождении остовного дерева с минимальной суммой весов входящих в него рёбер
6
1
2
5
3
4
100
10
30
5010
20
60
1
2
5
3
4
100
10
30
5010
20
60
Cost = 10 + 50 + 10 + 60 = 130 Cost = 100 + 10 + 50 + 20 = 180
![Page 7: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/7.jpg)
Применение остовных деревьев
7
Остовное дерево минимальной стоимости (Minimum spanning tree, MST) – это остовное дерево с минимальной суммой весов его ребер
Практическое применение MST
Формирование дерева для широковещательной рассылки информации в сети (tree for broadcasting)
прокладка TV-кабеля между домами (вес ребер –стоимость прокладки кабеля между парой домов)
Spanning Tree Protocol в телекоммуникационных сетях стандарта Ethernet для предотвращения образования циклов в сети
…7
![Page 8: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/8.jpg)
Алгоритмы построения MST
8
Алгоритм
Вычислительная сложность
Матрица смежности
Списки смежности + двоичная куча
Списки смежности +фибоначчиева куча
Крускала(J. Kruskal, 1956)
𝑂(|𝐸| log |𝑉|)
Прима(V. Jarník, 1930; R. Prim, 1957;
E. Dijkstra, 1959)
𝑂( 𝑉 2) 𝑂(( 𝑉 + |𝐸|) log |𝑉|) 𝑂( 𝐸 + |𝑉| log |𝑉|)
Борувки(O. Borůvka, 1926)
𝑂(|𝐸| log |𝑉|)
(B. Chazelle, 2000)𝑂(|𝐸| ∙ 𝛼( 𝐸 , |𝑉|)),
где α(m, n) – обратная функция Аккермана
![Page 9: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/9.jpg)
Система непересекающихся множеств
9
Система непересекающихся множеств (Disjoint-set data structure) – структура данных для представления непересекающихся множеств
Поддерживает следующие операции:
MakeSet(i) – создает множество из одного элемента i
FindSet(i) – возвращает номер множества, которому принадлежит элемент i
UnionSets(i, j) – объединяет множества, содержащие элементы i и j
Подробное описание (Aho, С. 169, MFSET)
(Levitin, С. 381)
(CLRS, С. 582)
![Page 10: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/10.jpg)
Система непересекающихся множеств
10
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}
![Page 11: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/11.jpg)
Алгоритм Крускала (Kruskal)
11
6
2
1
4
6
3
5
5
3
6
2
15 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 компонент связности
![Page 12: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/12.jpg)
Алгоритм Крускала (Kruskal)
12
6
2
1
4
6
3
5
5
3
6
2
15 5
6 4
3. Цикл из n – 1 итерации (по количеству ребер в MST)
a) Из очереди извлекается ребро (i, j) с минимальным весом(HeapDeleteMin)
b) Если ребро (i, j) связывает вершины из разных компонент связности графа T, то ребро добавляется в граф T
G
2
1
4
6
3
5
T
Prio. Q: (1, 3), (4, 6), (2, 5), (3, 6), (2, 3), …
![Page 13: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/13.jpg)
Алгоритм Крускала (Kruskal)
13
6
2
1
4
6
3
5
5
3
6
2
15 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), …
![Page 14: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/14.jpg)
Алгоритм Крускала (Kruskal)
14
6
2
1
4
6
3
5
5
3
6
2
15 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: (4, 6), (2, 5), (3, 6), (2, 3), …
![Page 15: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/15.jpg)
Алгоритм Крускала (Kruskal)
15
6
2
1
4
6
3
5
5
3
6
2
15 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: (2, 5), (3, 6), (2, 3), …
![Page 16: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/16.jpg)
Алгоритм Крускала (Kruskal)
6
2
1
4
6
3
5
5
3
6
2
15 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: (3, 6), (2, 3), …
![Page 17: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/17.jpg)
Алгоритм Крускала (Kruskal)
6
2
1
4
6
3
5
5
3
6
2
15 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: (2, 3), …
![Page 18: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/18.jpg)
Алгоритм Крускала (Kruskal)
6
2
1
4
6
3
5
5
3
6
2
15 5
6 4
3. Цикл из n – 1 итерации (по количеству ребер в MST)
a) Из очереди извлекается ребро (i, j) с минимальным весом(HeapDeleteMin)
b) Если ребро (i, j) связывает вершины из разных компонент связности графа T, то ребро добавляется в граф T
G
2
1
4
6
3
5
T
Построили остовное дерево Tминимальной стоимости (MST)
Стоимость 1 + 5 + 3 + 4 + 2 = 15
![Page 19: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/19.jpg)
Алгоритм Крускала (Kruskal)
19
function MST_Kruskal([in] G, [out] T)// Input: G = (V, E) // Output: T = (V, E’) T = CreateGraph(|V|)
// Помещаем вершину i в отдельное множество // (компоненту связности графа T)for each i in V do
MakeSet(i)end for
// Помещаем ребра в очередь с приоритетомfor each (i, j) in E do
PriorityQueueInsert(w[i][j], (i, j))end for
C = |V| // Количество компонент связности
![Page 20: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/20.jpg)
Алгоритм Крускала (Kruskal)
20
while C > 1 do// Извлекаем ребро с минимальным весом(i, j) = PriorityQueueRemoveMin()seti = FindSet(i)setj = FindSet(j)if seti != setj then
// Концы ребра из разных множеств GraphAddEdge(T, (i, j))UnionSets(i, j)C = C - 1
end ifend for
end function
![Page 21: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/21.jpg)
Алгоритм Крускала (Kruskal)
21
function MST_Kruskal([in] G, [out] T)// Input: G = (V, E) // Output: T = (V, E’) T = CreateGraph(|V|)
// Помещаем вершину i в отдельное множество // (компоненту связности графа T)for each i in V do
MakeSet(i)end for
// Помещаем ребра в очередь с приоритетомfor each (i, j) in E do
PriorityQueueInsert(w[i][j], (i, j))end for
C = |V| // Количество компонент связности
MFSET (Aho)O(|V|)
Binary heapO(|E|log|E|)
![Page 22: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/22.jpg)
Алгоритм Крускала (Kruskal)
22
while C > 1 do// Извлекаем ребро с минимальным весом(i, j) = PriorityQueueRemoveMin()seti = FindSet(i)setj = FindSet(j)if seti != setj then
// Вершины ребра из разных множеств GraphAddEdge(T, (i, j))UnionSets(i, j)C = C - 1
end ifend for
end function
O(log|E|)
O(1)
O(1)
O(|V|)
В худшем случае цикл выполняется |E| раз
![Page 23: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/23.jpg)
Алгоритм Крускала (Binary heap + MFSET)
23
𝑇Kruskal = 𝑂 𝑉 + 𝑂 𝐸 log 𝐸 + 𝑂 𝐸 log 𝐸 + 𝑂 𝑉 2
Извлечение ребер из очереди
Объединение множеств
Вставка ребер в очередь
Создание множеств
log 𝐸 ≤ log 𝑉 2 = 2 log |𝑉|
𝑇Kruskal = 𝑂 𝐸 log 𝐸 + 𝑂 𝑉 2 = 𝑂 𝐸 log 𝑉 + 𝑂 𝑉 2
Отчего зависит сложность алгоритма Крускала
от реализации сортировки ребер по их весу (Sort, Binary heap, …)
от реализации системы непересекающихся множеств
![Page 24: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/24.jpg)
/* 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
24elems
sets
![Page 25: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/25.jpg)
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
TCreate = O(nelems)
![Page 26: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/26.jpg)
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
26
TMakeSet = O(1)
![Page 27: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/27.jpg)
MFSET
27
int mfset_findset(struct mfset *set, int elem){
return set->elems[elem].set;}
TFindSet = O(1)
![Page 28: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/28.jpg)
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
28
![Page 29: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/29.jpg)
/* 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
29
TUnion = O(n)
![Page 30: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/30.jpg)
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);}
Алгоритм Крускала (Adj. matrix + MFSET + Bin. heap)
30
![Page 31: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/31.jpg)
/* Insert edges in heap */pq = heap_create(n * n);
/* For all edges (adj. matrix) */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);
}}
}
Алгоритм Крускала (Adj. matrix + MFSET + Bin. heap)
31
![Page 32: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/32.jpg)
Алгоритм Крускала (Adj. matrix + MFSET + Bin. heap)
32
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++;}
}
heap_free(pq);mfset_free(set);return mstlen;
}
![Page 33: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/33.jpg)
Пример
33
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
15 5
6 4
![Page 34: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/34.jpg)
mst = graph_create(6);mstlen = search_mst_kruskal(g, mst);
printf("Minimum spanning tree: %d\n", 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;
}
Пример
34
![Page 35: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/35.jpg)
Пример
35
$ ./kruskalMinimum spanning tree: 15
0 0 1 0 0 0 0 0 5 0 3 0 1 5 0 0 0 40 0 0 0 0 20 3 0 0 0 0 0 0 4 2 0 0
![Page 36: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/36.jpg)
Алгоритм Прима (Prim)
36
6
2
1
4
6
3
5
5
3
6
2
15 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
![Page 37: Лекция 10: Графы. Остовные деревья минимальной стоимости](https://reader034.fdocuments.net/reader034/viewer/2022042715/558c9609d8b42af0248b469b/html5/thumbnails/37.jpg)
Домашнее чтение
Прочитать о системе непересекающихся множеств в [Aho] и [CLRS]