
Обходы графов (в глубину, в ширину).ppt
- Количество слайдов: 31
1. Обход графов в глубину Обход в глубину - это обход графа по следующим правилам: 1. находясь в вершине x, нужно двигаться в любую другую, ранее непосещенную вершину (если таковая найдется), одновременно запоминая дугу, по которой впервые попали в данную вершину; 2. если из вершины x нельзя попасть в ранее непосещенную вершину или таковой нет, то возвращаемся в вершину z, из которой впервые попали в x, и продолжаем обход в глубину из вершины z.
Пусть, например, v 0=1
Перед обращением к процедуре Depth_First_Search() необходимо провести инициализацию: t: =Head; While t<>Tail do begin t^. Flag: =TRUE; t: =t^. Next end;
Рекурсивная процедура обхода графа в глубину для графа, представленного в памяти структурой Вирта. PROCEDURE Depth_First_Search (r: Lref); {Рекурсивный обход графа в глубину, r - указатель на структуру Вирта } var t: Tref; BEGIN t: =r^. Trail; Write (r^. Key, ' '); r^. Flag: =FALSE; While t<>Nil do begin If t^. Id^. Flag then Depth_First_Search (t^. Id); t: =t^. Next end END;
В формулировке нерекурсивного алгоритма поиска в глубину на графе предполагается: 1. зафиксирован некоторый линейный порядок на множестве всех вершин графа; 2. множество вершин, смежных со всякой вершиной графа, также линейно упорядочено.
While Имеется хотя бы одна непосещенная вершина do begin Пусть p - первая из непосещенных вершин. Посетить вершину p и поместить ее в пустой стек S; While Стек S непуст do begin Пусть p - вершина, находящаяся на верхушке стека S; If У вершины p есть непосещенные смежные вершины then begin Пусть q - первая непосещенная вершина из вершин, смежных вершине p. Пройти по ребру (p, q), посетить вершину q и поместить ее в стек S end else Удалить вершину p из стека S end
Другой подход к поиску в глубину Обнаружив впервые вершину v, смежную с u, отмечаем это событие, помещая в поле [v] значение u. Получается дерево или несколько деревьев, если поиск повторяется из нескольких вершин. Получаем граф предшествования:
Подграф предшествования представляет собой лес поиска в глубину, состоящий из деревьев поиска в глубину. Каждая из вершин вначале белая. Будучи обнаруженной, она становится серой; она станет чёрной, когда будет полностью обработана, т. е. когда список смежных с ней вершин будет просмотрен. Каждая вершина попадает ровно в одно дерево поиска в глубину, так что эти деревья не пересекаются.
Поиск в глубину ставит на вершинах метки времени: d[v] –время, когда вершина была обнаружена; f [v] – когда была закончена обработка списка смежных с v вершин. В процедуре DFS 1. метки времени d[v] и f [v] являются целыми числами от 1 до 2 2. для любой вершины u выполнено неравенство
Исходный граф может быть ориентированным или неориентированным. Переменная time – глобальная переменная текущего времени, используемого для пометок. DFS(G) 1 for всех вершин 2 do color [u] ← БЕЛЫЙ 3 4 time ← 0 5 for всех вершин 6 do if 7 then DFS-Visit(u)
DFS-Visit(u) 1 { Вершина u была белой} 2 3 for {Обработать ребро } 4 do if 5 then 6 DFS-Visit(v) 7 8 {Вершина обработана}
При обходе в глубину чем позднее будет посещена вершина, тем раньше она будет использована. Это прямое следствие того факта, что просмотренные, но еще не использованные вершины накапливаются в стеке.
Поиск в ширину Основывается на замене стека очередью. Использование вершины происходит с помощью просмотра сразу всех еще непросмотренных вершин, смежных этой вершине. Таким образом, "поиск ведется как бы во всех возможных направлениях одновременно"
Процедура нерекурсивного обхода графа в ширину (граф моделируется структурой Вирта). PROCEDURE Breadth_First_Search (H: Lref); { Нерекурсивный обход графа в ширину, начиная с вершины, заданной указателем H } var L: svqz; R: svqz; p: Lref; t: Tref; BEGIN L: =Nil; R: =Nil; { Указатель на начало очереди} { Указатель на конец очереди } { Рабочий указатель } { Создание пустой очереди }
Добавление элемента H в очередь, заданную указателями L и R; (написать самостоятельно) H^. Flag: =FALSE; While L<>Nil do { Пока очередь не пуста… } begin Удаление элемента указателями L и R элемента в самостоятельно) из очереди, заданной и помещение удаленного переменную p; (написать
Write (p^. Key, ' '); { Посещение вершины } t: =p^. Trail; While t<>Nil do begin If t^. Id^. Flag then begin Добавление элемента t^. Id в очередь, заданную указателями L и R; (написать самостоятельно) t^. Id^. Flag: =FALSE end; t: =t^. Next end END;
Другой подход Пусть задан граф G = (V, E) и фиксирована начальная вершина s. Алгоритм поиска в ширину перечисляет все достижимые из s (если идти по дугам) вершины в порядке возрастания расстояния от s. Расстоянием считается длина (число рёбер) кратчайшего пути. В процессе поиска из графа выделяется часть, называемая деревом поиска в ширину с корнем s. Она содержит все достижимые из s вершины (и только их).
Процедура BFS использует представление графа G = (V, E) списками смежных вершин. Для каждой вершины u графа дополнительно хранятся её цвет color[u] и её предшественник [u]. Если предшественника нет (например, если u=s или u ещё не обнаружена), [u]=NIL. Расстояние от s до u записывается в поле d[u]. Процедура использует очередь Q (FIFO) для хранения множества серых вершин.
BFS (breadth-first search) 1 for каждой вершины u V[G]{s} 2 3 4 5 6 7 8 do color[u] белый d[u] NIL Color[s] серый d[s] 0 [s] NIL Q {s}
9 10 11 12 13 while Q do u head[Q] for всех v Adj[u] do if color[v]=белый then color[v] серый 14 d[v] d[u]+1 15 [v] u
16 17 18 Enqueue (Q, v) Dequeue(Q) color[u] чёрный
Исполнение процедуры BFS для неориентированного графа A) r s t 0 u Q v w x y s 0
Б) r 1 s t 0 u Q w r v 1 w x y 1 1
В) r 1 t s 0 u 2 Q v 1 2 w x y r t 1 2 x 2
Г) r 1 t s 0 u 2 Q 2 v 1 2 w x y r t 2 x v 2 2
Д) r 1 t s 0 u 2 3 Q 2 v 1 2 w x y x r 2 v u 2 3
Е) r 1 t s 0 u 2 3 Q 2 v 1 2 3 w x y v u y r 2 3 3
Ж) r s t u 1 0 2 3 Q 2 1 2 3 v w x y u 3 y 3
З) r s t u 1 0 2 3 Q 2 1 2 3 v w x y y 3
И) r s t u 1 0 2 3 Q 2 1 2 3 v w x y
Обходы графов (в глубину, в ширину).ppt