Сеть 8. Графы 1
8. 1. Ориентированный граф G – пара (V, E), где V – конечное множество вершин графа G, V = {vi}, i = 1, 2, …, n, vi – вершина графа E – множество ребер графа G; упорядоченные пары вершин из V, E = {ej}, ei = (u, v), u V, v V, ei – ребро графа; выходит из вершины u и входит в вершину v 2
8. 1. Ориентированный граф Пример: V = {1, 2, 3, 4, 5, 6}, E = {(1, 2), (2, 4), (2, 5), (4, 1), (4, 5), (5, 4), (6, 3)} 1 2 3 4 5 6 3
8. 2. Неориентированный граф G – пара (V, E), где V – конечное множество вершин графа G, V = {vi}, i = 1, 2, …, n, vi – вершина графа E – множество ребер графа G; неупорядоченные пары вершин из V, E = {ej}, ei = (u, v), u V, v V, u v ei – ребро графа; соединяет вершины u и v 4
8. 2. Неориентированный граф Пример: V = {1, 2, 3, 4, 5, 6}, E = {1, 2), (1, 5), (2, 5), (3, 6)} 1 2 3 4 5 6 5
8. 3. Определения • Если (u, v) – ребро графа G, тогда вершина u графа – смежная с вершиной v: u v • Степень вершины в неориентированном графе – число ребер, соединяющих ее с другими вершинами • Вершина со степенью 0 – изолированная 6
8. 3. Определения • В ориентированном графе: исходящая степень – количество выходящих из вершины ребер, входящая степень – количество входящих в вершину ребер • Степень вершины в ориентированном графе = исходящая степень + входящая степень 7
8. 3. Определения • Путь (маршрут) длины k от вершины u к вершине v в графе G = (V, E) – последовательность вершин
8. 3. Определения • Путь содержит вершины v 0, v 1, …, vk и ребра (v 0, v 1), (v 1, v 2), …, (vk-1, vk) • Если имеется путь p из вершины u в вершину v, говорят, что вершина u достижима из вершины v по пути p • Пусть является простым, если все вершины пути – различны 9
8. 3. Определения • В ориентированном графе путь
8. 3. Определения • Взвешенный граф – граф, с каждым ребром которого связан определенный вес, обычно определяемый весовой функцией w: E R 11
8. 4. Представление графа 1. Набор списков смежных вершин. . . . ø ø Для взвешенных графов вес ребра (u, v) хранится вместе с вершиной v в списке смежности u 12
8. 4. Представление графа Пример – неориентированный граф 1 3 2 3 4 5 1 4 1 2 4 1 3 ø ø 2 3 4 ø 5 4 5 ø ø 13
8. 4. Представление графа Пример – ориентированный граф 1 4 6 2 5 3 4 1 2 3 4 5 6 5 ø 6 2 ø ø 5 2 ø 4 ø 6 ø 14
8. 4. Представление графа 2. Матрица смежности. . . vj. . . vi . . . 0/1 . . . 15
8. 4. Представление графа Пример – неориентированный граф 1 1 2 3 4 5 0 1 1 1 0 1 0 0 1 1 0 16
8. 4. Представление графа Пример – ориентированный граф 1 1 2 3 4 5 6 2 4 5 6 3 1 2 3 4 5 6 0 0 0 1 0 0 0 1 1 0 0 0 1 17
8. 5. Поиск в ширину Один из простейших алгоритмов обхода графа Задан граф G = (V, E) Выделена исходная вершина s Находятся все вершины, достижимые из s Строится дерево поиска в ширину с корнем s 18
8. 5. Поиск в ширину Окрашивание вершин графа: белые – еще не открытые вершины, серые и черные – открытые вершины, которые обрабатываются по-разному: вершины, смежные с черной, серые или черные; вершины, смежные с серой, могут быть белыми 19
8. 5. Поиск в ширину Корень дерева – s Сканируется список смежности открытой вершины u : если открывается белая вершина v, то вершина v и ребро (u, v) добавляются в дерево u – предшественник (или родитель) v в дереве поиска вширь, v – потомок u BFS – Breadth-First Search 20
8. 5. Алгоритм поиска BFS(G, s) Обозначения: Adj[u] – список смежности для вершины u color[u] – цвет вершины u pred[u] – предшественник вершины u; если предшественника нет, pred[u] = NULL d[u] – расстояние от s до вершины u Q – очередь для работы с множеством серых вершин 21
8. 5. Алгоритм поиска BFS(G, s) Инициализация: Для каждой вершины u V[G], кроме s { color[u] = белый d[u] = pred[u] = NULL } color[s] = серый d[s] = 0 pred[s] = NULL Записать s в очередь Q 22
8. 5. Алгоритм поиска BFS(G, s) while Q не пуста { u = очередная вершина из Q для каждой v Adj[u] if color[v] = белый { color[v] = серый d[v] = d[u] + 1 pred[v] = u Записать v в Q } color[u] = черный } 23
8. 6. Пример Инициализация r s 0 t u v w x y Q s 0 24
8. 6. Пример 1 -я итерация цикла while r 1 s 0 t u 1 v w x y Q w r 1 1 25
8. 6. Пример 2 -я итерация цикла while r 1 t 2 u 1 2 v Q s 0 w x y r t x 1 2 2 26
8. 6. Пример 3 -я итерация цикла while r 1 t 2 u 2 1 2 v Q s 0 w x y t x v 2 27
8. 6. Пример 4 -я итерация цикла while r 1 s 0 t 2 u 3 2 1 2 v w x y Q x v u 2 2 3 28
8. 6. Пример 5 -я итерация цикла while r 1 s 0 t 2 u 3 2 1 2 3 v w x y Q v u y 2 3 3 29
8. 6. Пример 6 -я итерация цикла while r 1 s 0 t 2 u 3 2 1 2 3 v w x y Q u y 3 3 30
8. 6. Пример 7 -я итерация цикла while r 1 s 0 t 2 u 3 2 1 2 3 v w x y Q y 3 31
8. 6. Пример 8 -я итерация цикла while r 1 s 0 t 2 u 3 2 1 2 3 v w x y Q Ø 32
8. 6. Пример s 0 r 1 2 w 1 x 2 t 2 3 3 y u v 33
8. 7. Анализ алгоритма Общее время операций с очередью – Ο(V) Сумма длин всех списков смежности – (E) Общее время сканирования списков – Ο(E) Накладные расходы на инициализацию – Ο(V) Общее время работы процедуры BFS – Ο(V + E) 34
8. 8. Кратчайшие пути Длина кратчайшего пути (s, v) от s до v – минимальное количество ребер на каком-либо пути от s к v Если пути от s к v не существует, то (s, v) = Путь длиной (s, v) от s до v – кратчайший путь от s к v 35
8. 9. Корректность поиска в ширину Пусть G = (V, E) – ориентированный или неориентированный граф, и пусть процедура BFS выполняется над графом G с определенной вершиной s. Тогда в процессе работы BFS открывает все вершины v V, достижимые из s, и по окончании работы для всех v V d[v] = (s, v) 36
8. 9. Корректность поиска в ширину Кроме того, для всех достижимых из s вершин v s, один из кратчайших путей от s к v – это путь от s к pred[v], за которым следует ребро (pred[v], v) 37
8. 10. Деревья поиска в ширину Для графа G = (V, E) с исходной вершиной s определяется подграф предшествования Gpred = (Vpred, Epred), где Vpred = {v V : pred[v] NULL} {s} Epred = {(pred[v], v) : v Vpred – {s}} 38
8. 10. Деревья поиска в ширину Подграф предшествования Gpred является деревом поиска в ширину, если Vpred состоит из вершин, достижимых из s, и для всех v Vpred в Gpred имеется единственный простой путь из s в v, такой, что он одновременно является кратчайшим путем из s в v в G 39
8. 11. Поиск в глубину Подграф предшествования поиска в глубину определяется как Gpred = (V, Epred), где Epred = {pred[v], v) : v V и pred[v] NULL} Подграф предшествования поиска в глубину образует лес поиска в глубину, состоящий из нескольких деревьев поиска в глубину 40
8. 11. Поиск в глубину Вершины графа: изначально белые, при открытии (discover) – серые, по завершении (finish): список смежности полностью сканирован – черные 41
8. 11. Поиск в глубину Метки времени (timestamp) вершины v: d[v] – когда вершина открывается (и окрашивается в серый цвет) f[v] – завершается сканирование списка смежности вершины v (вершина становится черной) DFS – Depth-First Search 42
8. 12. Алгоритм поиска DFS(G) Обозначения: Adj[u] – список смежности для вершины u color[u] – цвет вершины u pred[u] – предшественник вершины u d[u] – метка времени открытия вершины u f[u] – метка времени завершения работы с вершиной u d [u ] < f [u ] 43
8. 12. Алгоритм поиска DFS(G) time – глобальная переменная, используемая для меток времени d[u], f[u] – целые числа в диапазоне от 1 до |V| Цвет вершины u: до момента времени d[u] – белый между d[u] и f[u] – серый после f[u] – черный 44
8. 12. Алгоритм поиска DFS(G) Инициализация: Для каждой вершины u V[G] { color[u] = белый pred[u] = NULL } time = 0 45
8. 12. Алгоритм поиска DFS(G) Обработка: Для каждой вершины u V[G] { if color[u] = белый DFS_Visit(u) } 46
8. 13. Алгоритм DFS_Visit(u) color[u] = серый time = time + 1 d[u] = time для каждой вершины v Adj[u] if color[v] = белый{ pred[v] = u DFS_Visit(v) } 47
8. 13. Алгоритм DFS_Visit(u) color[u] = черный time = time + 1 f[u] = time 48
8. 14. Пример Инициализация u v w x y z time = 0 49
8. 14. Пример Первая вершина – u u 1/ v w x y z time = 1 50
8. 14. Пример Смежная вершина для u u 1/ v 2/ w x y z time = 2 51
8. 14. Пример Смежная вершина для v u 1/ v 2/ w 3/ x y z time = 3 52
8. 14. Пример Смежная вершина для y u 1/ v 2/ 4/ 3/ x y w z time = 4 53
8. 14. Пример Смежная вершина для x – завершение u 1/ v 2/ 4/5 3/ x y w z time = 5 54
8. 14. Пример Завершение для y u 1/ v 2/ 4/5 3/6 x y w z time = 6 55
8. 14. Пример Завершение для v u 1/ v 2/7 4/5 3/6 x y w z time = 7 56
8. 14. Пример Завершение для u u 1/8 v 2/7 4/5 3/6 x y w z time = 8 57
8. 14. Пример Новая вершина – w u 1/8 v 2/7 4/5 3/6 x y w 9/ z time = 9 58
8. 14. Пример Смежная вершина для w u 1/8 v 2/7 w 9/ 4/5 3/6 10/ x y z time = 10 59
8. 14. Пример Завершение для z u 1/8 v 2/7 w 9/ 4/5 3/6 10/11 x y z time = 11 60
8. 14. Пример Завершение для w u 1/8 v 2/7 w 9/12 4/5 3/6 10/11 x y z time = 12 61
8. 15. Задача о кратчайшем пути Дано: – взвешенный ориентированный граф G = (V, E) – весовая функция w : E R Вес пути 62
8. 15. Задача о кратчайшем пути Вес кратчайшего пути 63
8. 16. Алгоритм Дейкстры Для всех ребер (u, v) E w(u, v) ≥ 0 s – начальная вершина (исток) S – множество вершин, для которых уже вычислены веса кратчайших путей к ним из истока s Q – неубывающая очередь с приоритетами; приоритет – d[i] d[v] – кратчайшее расстояние от s к v 64
8. 17. Dijkstra(G, w, s) Инициализация: для каждой вершины v V[G] { d[v] = pred[v] = NULL } d[s] = 0 S = пустое множество Q = V[G] – все вершины графа 65
8. 17. Dijkstra(G, w, s) while Q не пусто { u = Extract_Min(Q) добавить вершину u в множество S для каждой вершины v Adj[u] if d[v] > d[u] + w(u, v){ d[v] = d[u] + w(u, v) pred[v] = u } } 66
8. 18. Анализ эффективности Зависит от способа реализации очереди с приоритетами: (V 2) – вектор (E log. V) – бинарная неубывающая пирамида (V log. V + E) – пирамида Фибоначчи 67