Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
РГР№ 2_ВТГ.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
1 Мб
Скачать

Часть 2. Систематический обход графа методами «в глубину» и «в ширину»

Определения:

Обходом графа называется некоторое систематическое перечисление его вершин или ребер.

Неориентированное дерево - неориентированный граф не имеющий циклов.

Корневое дерево – дерево, одна из вершин которого выбрана в качестве корня.

В остальные вершины дерева существует единственный маршрут -простая цепь.

Выходящее ориентированное дерево: орграф , не имеющий циклов, все вершины которого имеют полустепень захода равную 1 кроме корня, а полустепень захода в корень равна 0.

Дерево поиска в ширину– дерево с корнем в начальной вершине, отображающее последовательность обхода вершин графа в соответствии с их расстоянием от начальной вершины.

Обходы в ширину

Для заданного графа G(V,E) и фиксированной начальной вершины v алгоритм «поиска в ширину» перечисляет все достижимые из v (если проходить по рёбрам) вершины в порядке возрастания расстояния от v. Расстоянием до вершины считается длина (число рёбер) кратчайшего пути. В процессе поиска из графа выделяется часть, называемая «деревом поиска в ширину» с корнем v. Она содержит все достижимые из v вершины (и только их). Для каждой из них путь из корня в дереве поиска будет одним из кратчайших путей (из начальной вершины) в графе.

Алгоритм применим к ориентированным и неориентированным графам.

Алгоритм BFS

Одна из известных реализаций алгоритма под названием BFS использует представление графа G(V,E) списками смежных вершин (окрестностями). Для каждой вершины v графа дополнительно хранятся её цвет и вершина-предшественник – s(v). Кроме того, хранится метка d(v) – расстояние от исходной вершины u до вершины v .

В алгоритме используются следующие наглядные обозначения:

1) до начала работы алгоритма все вершины белые;

2) если вершина в ходе работы алгоритма встречается первый раз – она изменяет цвет на серый;

3) если вершина полностью обработана, она окрашивается в чёрный цвет.

Вершины, находящиеся в обработке, включаются в очередь вершин в соответствующем порядке. По окончании обработки вершины исключаются из очереди.

Описание алгоритма

Шаг 1. Окрашиваем все вершины графа в белый цвет.

Шаг 2. Пусть u начальная вершина поиска. Приписываем ей метку d(u)=0.

Предшествующая вершина отсутствует, s(u)=-1. Включаем вершину u

в очередь не обработанных вершин.

Шаг 3. Обрабатываем вершину v*, стоящую первой в очереди вершин.

Просматриваем окрестность O(v*) этой вершины. Если в окрестности есть белые вершины, то идем к шагу 4, иначе к шагу 5.

Шаг 4. Берем белую вершину v из окрестности окрашиваем ее серым цветом и включаем в очередь на обработку. Присваиваем вершине v метку d(v)=d(v*)+1. Запоминаем вершину v’, предшествуюшую вершине v в очереди. Повторяем действия шага 4 для окрестности.

Шаг 5. Если все белые вершины в окрестности v* исчерпаны, то вершину v* окрашиваем черным цветом , считая, что она обработана и удаляем ее из очереди вершин. Переходим к шагу 3.

Если очередь пуста, то конец работы алгоритма.

Пример 2.1. В графе, заданном матрицей смежности осуществить поиск в ширину из первой вершины.

Нарисуем граф, соответствующий матрице (Рис.2.1)

Рис 2.1. Граф, построенный по заданной матрицей смежности.

Процесс работы алгоритма отобразим в табличном виде.

Шаг 1. Исходное состояние таблицы

Вершина

Окрестность вершины

Цвет

d(v)

s(v)

1

4 6

Белый

0

2

3 5 7

Белый

0

3

2 4 6

Белый

0

4

1 3 5

Белый

0

5

2 4

Белый

0

6

1 3 7

Белый

0

7

2 6

Белый

0

Шаг 2

Окрашиваем вершину 1 в серый цвет. Включаем в очередь на обработку.

Очередь вершин: (1)

Р ис.2.2. Дерево поиска в начале работы алгоритма

Вершина

Окрестность

Цвет

d(v)

s(v)

1

4 6

Серый

0

-1

2

3 5 7

Белый

3

2 4 6

Белый

4

1 3 5

Белый

5

2 4

Белый

6

1 3 7

Белый

7

2 6

Белый

Цикл обработки вершины 1

Вершина

Окрестность

Цвет

d(v)

s(v)

1

4 6

Серый

0

-1

2

3 5 7

Белый

0

3

2 4 6

Белый

0

4

1 3 5

Серый

1

1

5

2 4

Белый

0

6

1 3 7

Серый

1

4

7

2 6

Белый

0

Все белые вершины окрестности исчерпаны. Вершину 1 окрашиваем черным цветом . Вершина 1 обработана. Удаляем ее из очереди

Очередь:(4, 6)

Рис 2.3. Дерево поиска после обработки первой вершины графа.

Цикл обработки вершины 4

Вершина

Окрестность

Цвет

d(v)

s(v)

1

4 6

Черный

0

-1

2

3 5 7

Белый

0

3

2 4 6

Серый

2

6

4

1 3 5

Серый

1

1

5

2 4

Серый

2

3

6

1 3 7

Серый

1

4

7

2 6

Белый

0

Вершина 4 обработана, удаляем ее из очереди.

Очередь (6,3,5)

Рис.2.4. Дерево поиска после обработки вершины 4.

Цикл обработки вершины 6

Вершина

Окрестность

Цвет

d(v)

s(v)

1

4 6

Черный

0

-1

2

3 5 7

Белый

0

3

2 4 6

Серый

2

6

4

1 3 5

Черный

1

1

5

2 4

Серый

2

3

6

1 3 7

Серый

1

4

7

2 6

Серый

2

5

Очередь(3,5,7)

Рис.2.5. Дерево поиска после обработки вершины 6.

Цикл обработки вершины 3.

Вершина

Окрестность

Цвет

d(v)

s(v)

1

4 6

Черный

0

-1

2

3 5 7

Серый

3

7

3

2 4 6

Серый

2

6

4

1 3 5

Черный

1

1

5

2 4

Серый

2

3

6

1 3 7

Черный

1

4

7

2 6

Серый

2

5

Очередь (5,7,2)

Рис 2.6. Дерево поиска после обработки вершины 3.

Окрестности вершин 5, 7, 2 не имеют белых вершин, окрашиваем их черным цветом. Очередь пуста. Все вершины обработаны.

Результаты поиска в ширину

Рис.2.7. Дерево поиска в ширину

Последовательность обхода в ширину:

1 4 6 3 5 7 2

Обходы в глубину

Другим базовым алгоритмом обхода графов является «поиск в глубину».

Определения

Тупик – вершина графа, в которой при обходе отсутствуют исходящие ребра(пути) ведущие в ранее не посещенные вершины.

Дерево поиска в глубин у- дерево с корнем в начальной вершине, отображающее последовательность обхода вглубь до достижения тупиковых вершин с последующим возвратом к предыдущей вершине.

Идея алгоритма

Согласно этому алгоритму обход вершин графа осуществляется по следующему правилу. Начиная с некоторой вершины, движение осуществляется по ребрам ( исходящим дугам) графа, пока не встретится тупик. После попадания в тупик, мы возвращаемся назад вдоль пройденного пути, пока не обнаружим вершину, у которой есть исходящие ребра, ведущие в непосещенные вершины, и из нее идем по одному из таких ребер. Процесс заканчивается, когда мы возвращаемся в начальную вершину, а все соседние оказались уже посещенными. Если после этого остаются непосещенные вершины, то повторяем поиск из одной из них в соответствии с выше описанным алгоритмом.

Алгоритм применим как для ориентированных, так и неориентированных графов.

Наиболее подходящим способом реализации является рекурсия. В этом случае возвраты вдоль пройденного пути будут осуществляться автоматически, в случае

Описываемая далее реализация алгоритма носит название DFS.

программной реализации алгоритма.

Для наглядности вершины в процессе поиска также раскрашивают в белый, серый и черный цвет. Изначально все вершины помечены белым цветом (непомеченная вершина). Впервые обнаружив вершину красим ее серым цветом (помеченная, но не обработанная). По окончании обработки всех исходящих из вершины ребер красим ее черным цветом (помеченная и обработанная).

Реализация «поиска в глубину» под названием DFS использует понятия вершина-предшественник и метки времени., но они имеют несколько другой смысл, чем в предыдущем алгоритме.

Вершина предшественник - это предпоследняя вершина лежащая на пути движения из корня в данную вершину. Переходя из вершины v в вершину u по ребру (v, u) запоминаем предшественника s(u)= v. Для вершин, у которых предшественника нет можно положить s(u)= -1. Таким образом, получаем дерево поиска в глубину. Если поиск повторяется из нескольких корневых вершин, то строим лес, состоящий из нескольких деревьев.

Помимо этого для каждой вершины в процессе поиска запоминается еще два параметра: d(v)- время первого попадания в вершину (метка входа) и f(v)-время окончания обработки всех исходящих ребер (метка выхода), где - d(v), f(v) целые. При этом используется единый счетчик времени t, принимающий значения от 1 до 2*n.

Цвета вершин и метки времени представляют удобный инструмент анализа свойств графа и в дальнейшем используются в различных алгоритмах на графах, в основе которых лежит поиск в глубину.

Описание алгоритма

Шаг 1. Все вершины окрашиваем в белый цвет. Метки входа и выхода принимают нулевые значения. Счетчик времени t=0.

Шаг 2. Начальную вершину (корень) v0 поиска окрашиваем в серый цвет. t=t+1. Присваиваем значения метке входа d(v0)=t и s(v0)= -1.

Шаг 3. Осуществляем переход в глубину из вершины v=v0 к непомеченной вершине u по исходящему ребру,. t=t+1, переход к шагу 4;

Если таких путей нет: t=t+1. Метка выхода f(v0)=t. Окрашиваем v0 в черный цвет.

Если есть еще белые вершины, не связанные с корнем, строим еще одно дерево поиска, выбираем одну из белых вершин в качестве следующего корня нового дерева поиска и повторяем действия, начиная с шага 2.

Если все вершины черные, то конец алгоритма.

Шаг 4. Вершину u окрашиваем в серый цвет. s(u)=v. Присваиваем метке входа d(u)=t. Вершина u становится текущей v:=u.

Шаг 5. Если возможен переход из текущей вершины v к следующей вершине непомеченной вершине u по исходящему ребру, то t=t+1, переход к шагу 4;

Если это невозможно, то вершина v является тупиком, окрашиваем ее в черный цвет. t=t+1, f(v)=t. Переход к шагу 6.

Шаг 6. Осуществляем возврат к предшествующей вершине v:=s(v)

Если вершина v=v0 переход к шагу 3, иначе переход к шагу 5.

Пример 2.2.

Рассмотрим пошаговое исполнение алгоритма на примере орграфа (см. рис. 14).

Рис 2.8. .Исходный орграф (пример 2.2).

Рис. 2.9. .Раскраска вершин графа. Счетчик времени t=1

В таблице формируем значения меток времени d(v), f(v) и предшествующей вершины s(v) в данный момент времени t=1

V

1

2

3

4

5

s(v)

-1

0

0

0

0

d(v)

1

0

0

0

0

f(v)

0

0

0

0

0

Двигаясь от вершины 1 вглубь, окрашивая вершины 2, 3 4 в серый цвет доходим до вершины 4, которая является тупиком, так как из нее нет путей в белые вершины.

Рис 2.10. .Раскраска вершин графа. Счетчик времени t=3

Вершину 4 окрашиваем в черный цвет.

Рис. 2.11. Раскраска вершин графа. Счетчик времени t=4

V

1

2

3

4

5

s(v)

-1

1

0

2

0

d(v)

1

2

0

3

0

f(v)

0

0

0

4

0

Возвращаемся к вершине 2. Переходим в вершину 5

Вершина 5 также является тупиком.

Рис. 2.12. Раскраска вершин графа. Счетчик времени t=6

V

1

2

3

4

5

s(v)

-1

1

0

2

2

d(v)

1

2

0

3

5

f(v)

0

0

0

4

6

Возвращаемся к вершине 2. Из вершины 2 нет возможности перехода к неокрашенной вершине. Возвращаемся к вершине 1. Из нее также нет путей в неокрашенные вершины. Однако не все вершины графа исчерпаны.

Рис. 2.13. Раскраска вершин графа. Счетчик времени t=8.

V

1

2

3

4

5

s(v)

-1

1

0

2

2

d(v)

1

2

0

3

5

f(v)

8

7

0

4

6

Рис. 2.14. Раскраска вершин графа. Счетчик времени t=10

С вершины 3 начинается построение нового дерева. Поскольку из этой вершины не путей в неокрашенные вершины, второе дерево состоит из одной вершины 3 ( см. Рис. 2.15).

V

1

2

3

4

5

s(v)

-1

1

-1

2

2

d(v)

1

2

9

3

5

f(v)

8

7

10

4

6

Окончательные результаты работы алгоритма.

Рис. 2.15. Лес деревьев поиска в глубину для исходного графа .

Последовательность обхода вершин графа в глубину:

1 2 4 5 3

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]