Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Глава 2.Ненаправленные графы, часть 1.doc
Скачиваний:
25
Добавлен:
13.02.2016
Размер:
1.35 Mб
Скачать

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