- •Глава 2.
- •Замечание
- •2 Определения.1.2 Определение графа с помощью множеств
- •Определения
- •2.1.5. Матричный способ задания графов
- •Определения
- •Матрица инциденций
- •Матрица смежности
- •Матрица Лапласа (Кирхгоффа)
- •Определение
- •2.2.2. Бинарные операции над раздельными графами
- •Определения
- •Определения
- •Замечание
- •2.2.3. Унарные операции над графами
- •2.3. Некоторые виды графов
- •Определения
- •Определения
- •Определения
- •Определение
- •Замечание
- •Определения
- •Определения
- •2.5. Прогулки, тропы, пути и циклы
- •Определения
- •Теорема
- •Теорема
- •Точный алгоритм нахождения
- •Определения
- •Определения
- •Определения
- •Определения
- •Псевдокод
- •Класс сложности
- •2.8.2. Обход в ширину (bfs)
- •Класс сложности
2
Определения
.8. Обход графа

Обходом графа является последовательность вершин графа, в которой каждая вершина содержится ровно один раз.
Наиболее общие алгоритмы обхода графов:
Обход в глубину (Deph-First Search – DFS);
Обход в ширину (Breadth-First Search – BFS).
2
Определения
.8.1..Обход в глубину (DSF)

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

Введем три основных атрибутаалгоритмаDFS:
1) Раскрашивание вершин. При выполнении алгоритмаDFSвершины раскрашиваются в зависимости состояния вершины.

Раскрашивание вершин – это своебразная память (похоже на расбрасывание крошек хлеба в лабиринте – по ним можно определить местоположение в лабиринте).
2) Поддержка времени. Каждая вершинаuимеет два времени:время обнаруженияd[u] ивремя завершенияf[u]. Время обнаружения соответствует моменту изменения белого цвета на серый, а время завершения – изменению серого цвета на черный. Время начинается с 1 , и с каждой отметкой события (обнаружение или завершение) время увеличивается на единицу.
3) Вершины-предшественники и DFS-дерево. Для каждой пройденной вершины в специальный массив записывается вершина-предшественник:p[u]=v. Это позволяет организовать обратное движение алгоритма.
Каждый связанный компонент графа может быть превращен в дерево удалением некоторых ребер. Каждая вершена uв дереве будет иметьуказательна своего предшественника (родителя)p[u], создавая таким образомдерево предшественник-указатель.
Псевдокод

Инициализация и начало алгоритма
Для
всех вершин uделать
{ цвет {u}=белый;
p[u]=NULL;
}
Время=0;
Для всех вершин uделать
Если цвет [u]=белый,
тогдаDFS; Алгоритм
DFS
DFS:
Посетить (u);
Время=Время+1;
d[u]=Время;
цвет[u]=серый;
Для всех v,
инцидентныхu, делать
{ если цвет[v]=
белый, тогда
{p[v]=u;
DFS{u};
{
{
Время=Время+1;
f[u]=время;
цвет[u]черный;
Класс сложности

Сложность адгоритма DFS–O(n+m), гдеn=|V|,m=|E|, т.е.проблема относится кPклассу.


Задан граф и его таблица инцидентности:

Номер шага
Рисунок графа Описание
действий алгоритма
DFS

1 Обход в глубину
начинается с вершины I. d[I]=1
(отмечено на рис.). Вершина Iна рисунке и в таблице инцидентности
помечается серой.





















2 По таблице инцидентности
определя- ем вершины, инцидентные
I. Такой вершиной являетсяE. Переход вE. d[E]=2, p[E]=I. Вершина E на рисунке
и в таблице инцидентности помечается
серой.





















3
По таблице инцидентности
вершина Eимеет две белые
инцидентные вершиныBиF. СлучайноBвыбирается первой. d[B]=3, p[B]=E. Вершина Bна рисунке и в таблице инцидентности
– серая.



E 2


















4-6 Подобным образом
помечаются вершины A,C,D. d[A]=4; d[C]=5; d[D]=6; p[A]=B; p[C]=A; p[D]=C. Вершины A,C,Dстановятся серыми
A 4



E 2
C 5
















7-8 Вершина Dимеет 4 инцидентных вершины:A,C,G,H.
ВершиныAиCявляются серыми, поэтому выбирается
вершинаG. d[G]=7, p[G]=D. Затем выбирается
вершина F: d[F]=8, p[F]=G. Вершины GиFпомечаются серыми.
A 4



E 2
C 5
















9 A 4 Все вершины, инцидентные
F, являются серыми. Поэтому
алгоритм начинает обратное движение.
Поp[F]
предшественником является вершинаG.
Переходим в эту вершину. Вершина F– черная. f[F]=9
(отмечено жирной цифрой).



E 2


C 5

















10 Все вершины, инцидентные
Gлибо серые, либо черные.
ВершинаGстановится
черной. f[G]=10
(помечено жирной цифрой)
A 4



E 2
C 5
















A 4
11 Вершине Gпредшествовала вершина D (p[G]=D).
Возврат в вершинуD.
Имеется белая вершинаH,
инцидентнаяD. d[H]=11, p[H]=D. Вершина H
- черная



E 2


C 5















12-18 Вершина D,
инцидентнаяH,серая.
Поэтому начинается обратных обход. Вершина Hстановится черной. f[H]=12. Оставшиеся вершины
посещаются в обратном поряке согласно
массива предшественнов. Поочередно вершины
становятся черными: f[D]=13,f[C]=14,f[A]=15,f[B]=16,f[E]=17,f[I]=18
(отмечены жирным шрифтом)






















Раскраска таблицы инцидентности после 10 шагов:
A B C D -- A B C D --
B A E F -- B A E F --
C A D G -- C A D G --
D A C G H -- D A C G H --
E I F B -- E I F B --
E B F G -- E B F G --
F D C G -- F D C G --
D H -- D H --
E I -- E I --
Дерево предшественник-указатель (или дерево обхода в глубину):
A


B E
Все
остальные ребра графа, не вошедшие в
это дерево, являются ребрами касания
D C







G H I F




