|
Глава 2.Ненаправленные графы, часть 1. Простые графы (графы) Способы задания графа Основные способы задания графов графический
2 Определения .8. Обход графа
![](24055_html_m79022083.gif)
Обходом графа является последовательность вершин графа, в которой каждая вершина содержится ровно один раз.
Наиболее общие алгоритмы обхода графов:
Обход в глубину (Deph-First Search – DFS);
Обход в ширину (Breadth-First Search – BFS).
2 Определения .8.1..Обход в глубину (DSF)
![](24055_html_2dcc6868.gif)
Обход в глубину является алгоритмом систематического посещения (прохождения) вершин графа, состоящего из двух движений:
вперед (к еще непосещенной вершине) всегда, когда это возможно;
возврат от текущей вершины по пройденному ребру назад (к ранее пройденной вершине), если движение вперед от текущей вершины невозможно.
После завершения обхода в глубину все ребра связанного графа оказываются разбитыми на два класса:
ребра дерева, по которым осуществлялись впереходы из посещенных вершин в непосещенные;
ребра касания, замыкающие циклы графа.
Частичный граф, порожденный ребрами дерева, называется деревом обхода в глубину. Этот граф является каркасным графом исходного графа.
![](24055_html_m61c6bea7.gif) Введем три основных атрибута алгоритма DFS:
1) Раскрашивание вершин. При выполнении алгоритма DFS вершины раскрашиваются в зависимости состояния вершины.
![](24055_html_m74becb41.gif)
Раскрашивание вершин – это своебразная память (похоже на расбрасывание крошек хлеба в лабиринте – по ним можно определить местоположение в лабиринте).
2) Поддержка времени. Каждая вершина u имеет два времени: время обнаружения d[u] и время завершения f[u]. Время обнаружения соответствует моменту изменения белого цвета на серый, а время завершения – изменению серого цвета на черный. Время начинается с 1 , и с каждой отметкой события (обнаружение или завершение) время увеличивается на единицу.
3) Вершины-предшественники и DFS-дерево. Для каждой пройденной вершины в специальный массив записывается вершина-предшественник: p[u]=v. Это позволяет организовать обратное движение алгоритма.
Каждый связанный компонент графа может быть превращен в дерево удалением некоторых ребер. Каждая вершена u в дереве будет иметь указатель на своего предшественника (родителя) p[u], создавая таким образом дерево предшественник-указатель.
Псевдокод
![](24055_html_3b227c02.gif)
Инициализация и начало алгоритма Для всех вершин 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]черный;
Класс сложности
![](24055_html_4624189.gif)
Сложность адгоритма DFS – O(n+m), где n=|V|, m=|E|, т.е.проблема относится к P классу.
![](24055_html_m5d066d9e.gif)
![](24055_html_m49299dc7.gif)
Задан граф и его таблица инцидентности:
![](24055_html_2bd9180f.gif)
Номер
шага
Рисунок графа Описание действий
алгоритма DFS
![](24055_html_m4b9f17c7.gif)
1 Обход в глубину начинается с вершины I.
d[I]=1 (отмечено на рис.).
Вершина I на рисунке и в таблице инцидентности помечается серой. ![](24055_html_a784b7a.gif)
![](24055_html_32f8ad77.gif) ![](24055_html_m4e4680bd.gif) ![](24055_html_17708c07.gif)
![](24055_html_3552fc8a.gif) ![](24055_html_1abeda3a.gif) ![](24055_html_m53964c6f.gif) ![](24055_html_6f995e80.gif)
![](24055_html_32f8ad77.gif) ![](24055_html_m778f42ce.gif) ![](24055_html_32f8ad77.gif) ![](24055_html_b3e9b.gif)
![](24055_html_m154daf9b.gif) ![](24055_html_3f761644.gif) ![](24055_html_17708c07.gif) ![](24055_html_445b16c7.gif) ![](24055_html_4c54a98f.gif)
![](24055_html_m675df3b0.gif) ![](24055_html_m2c4434.gif) ![](24055_html_m3af5e432.gif)
![](24055_html_m154daf9b.gif)
2 По таблице инцидентности определя-
ем вершины, инцидентные I. Такой вершиной является E. Переход в E.
d[E]=2, p[E]=I.
Вершина E на рисунке и в таблице инцидентности помечается серой. ![](24055_html_a784b7a.gif)
![](24055_html_m4ba9f1f8.gif) ![](24055_html_m551a6b59.gif) ![](24055_html_fca2458.gif)
![](24055_html_7a8ddbf8.gif) ![](24055_html_5561fd48.gif) ![](24055_html_m1c496b1d.gif) ![](24055_html_m72038039.gif)
![](24055_html_m4ba9f1f8.gif) ![](24055_html_m778f42ce.gif) ![](24055_html_m4ba9f1f8.gif) ![](24055_html_34ce4673.gif)
![](24055_html_m154daf9b.gif) ![](24055_html_2e08384f.gif) ![](24055_html_fca2458.gif) ![](24055_html_m7228225d.gif)
![](24055_html_m2882d4de.gif) ![](24055_html_m4ff36342.gif) ![](24055_html_m3614efc1.gif) ![](24055_html_38b8efd.gif)
![](24055_html_m154daf9b.gif)
3
По таблице инцидентности вершина E имеет две белые инцидентные вершины B и F. Случайно B выбирается первой.
d[B]=3, p[B]=E.
Вершина B на рисунке и в таблице инцидентности – серая. ![](24055_html_a784b7a.gif)
![](24055_html_m4e4680bd.gif) ![](24055_html_17708c07.gif)
E
2 ![](24055_html_32f8ad77.gif)
![](24055_html_2d55b3c1.gif) ![](24055_html_1abeda3a.gif) ![](24055_html_m53964c6f.gif) ![](24055_html_m778f42ce.gif)
![](24055_html_m154daf9b.gif) ![](24055_html_3f761644.gif) ![](24055_html_17708c07.gif) ![](24055_html_445b16c7.gif) ![](24055_html_32f8ad77.gif) ![](24055_html_32f8ad77.gif) ![](24055_html_b3e9b.gif)
![](24055_html_4c54a98f.gif)
![](24055_html_m675df3b0.gif) ![](24055_html_m2c4434.gif) ![](24055_html_m3af5e432.gif)
![](24055_html_m154daf9b.gif)
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 ![](24055_html_2d55b3c1.gif)
![](24055_html_32f8ad77.gif) ![](24055_html_m4e4680bd.gif) ![](24055_html_17708c07.gif)
E
2 C
5
![](24055_html_2d55b3c1.gif) ![](24055_html_32f8ad77.gif) ![](24055_html_m778f42ce.gif) ![](24055_html_32f8ad77.gif) ![](24055_html_b3e9b.gif)
![](24055_html_m154daf9b.gif) ![](24055_html_3f761644.gif) ![](24055_html_17708c07.gif) ![](24055_html_445b16c7.gif) ![](24055_html_4c54a98f.gif)
![](24055_html_m675df3b0.gif) ![](24055_html_m2c4434.gif) ![](24055_html_m3af5e432.gif)
![](24055_html_m154daf9b.gif)
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 ![](24055_html_2d55b3c1.gif)
![](24055_html_32f8ad77.gif) ![](24055_html_m4e4680bd.gif) ![](24055_html_17708c07.gif)
E
2 C
5
![](24055_html_2d55b3c1.gif) ![](24055_html_32f8ad77.gif) ![](24055_html_m778f42ce.gif) ![](24055_html_32f8ad77.gif) ![](24055_html_b3e9b.gif)
![](24055_html_m154daf9b.gif) ![](24055_html_3f761644.gif) ![](24055_html_17708c07.gif) ![](24055_html_445b16c7.gif) ![](24055_html_m2b8f1e63.gif)
![](24055_html_m76e01335.gif) ![](24055_html_m2c4434.gif) ![](24055_html_m3af5e432.gif)
![](24055_html_m154daf9b.gif)
9 A
4 Все вершины, инцидентные F, являются серыми. Поэтому алгоритм начинает обратное движение. По p[F] предшественником является вершина G. Переходим в эту вершину.
Вершина F – черная.
f[F]=9 (отмечено жирной цифрой).
![](24055_html_2d55b3c1.gif) ![](24055_html_m4e4680bd.gif) ![](24055_html_17708c07.gif)
E
2 ![](24055_html_32f8ad77.gif)
![](24055_html_2d55b3c1.gif) C
5
![](24055_html_m778f42ce.gif)
![](24055_html_m154daf9b.gif) ![](24055_html_3f761644.gif) ![](24055_html_17708c07.gif) ![](24055_html_445b16c7.gif) ![](24055_html_32f8ad77.gif) ![](24055_html_32f8ad77.gif) ![](24055_html_b3e9b.gif)
![](24055_html_m76e01335.gif) ![](24055_html_m2c4434.gif) ![](24055_html_m3af5e432.gif) ![](24055_html_7f86b028.gif)
![](24055_html_m154daf9b.gif)
![](24055_html_a784b7a.gif)
![](24055_html_5afd5ee1.gif)
10 Все вершины, инцидентные G либо серые, либо черные. Вершина G становится черной.
f[G]=10 (помечено жирной цифрой)
A
4 ![](24055_html_2d55b3c1.gif)
![](24055_html_32f8ad77.gif) ![](24055_html_m4e4680bd.gif) ![](24055_html_17708c07.gif)
E
2 C
5
![](24055_html_2d55b3c1.gif) ![](24055_html_32f8ad77.gif) ![](24055_html_m778f42ce.gif) ![](24055_html_32f8ad77.gif) ![](24055_html_b3e9b.gif)
![](24055_html_m154daf9b.gif) ![](24055_html_3f761644.gif) ![](24055_html_17708c07.gif) ![](24055_html_445b16c7.gif) ![](24055_html_7f86b028.gif)
![](24055_html_39d90315.gif) ![](24055_html_m2c4434.gif) ![](24055_html_m3af5e432.gif)
![](24055_html_m154daf9b.gif)
A
4 11 Вершине G предшествовала вершина
D (p[G]=D). Возврат в вершину D. Имеется белая вершина H, инцидентная D.
d[H]=11, p[H]=D.
Вершина H - черная
![](24055_html_2d55b3c1.gif) ![](24055_html_m4e4680bd.gif) ![](24055_html_17708c07.gif)
E
2 ![](24055_html_32f8ad77.gif)
![](24055_html_2d55b3c1.gif) C
5
![](24055_html_m778f42ce.gif)
![](24055_html_m154daf9b.gif) ![](24055_html_3f761644.gif) ![](24055_html_17708c07.gif) ![](24055_html_445b16c7.gif) ![](24055_html_32f8ad77.gif) ![](24055_html_32f8ad77.gif) ![](24055_html_b3e9b.gif)
![](24055_html_39d90315.gif) ![](24055_html_m7ede53bc.gif) ![](24055_html_m3af5e432.gif) ![](24055_html_7f86b028.gif)
![](24055_html_m154daf9b.gif)
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 (отмечены жирным шрифтом)
![](24055_html_m7f54c230.gif) ![](24055_html_3a2deb39.gif)
![](24055_html_m4e4680bd.gif) ![](24055_html_17708c07.gif)
![](24055_html_m1904af62.gif) ![](24055_html_32f8ad77.gif)
![](24055_html_5fb08574.gif) ![](24055_html_m7117acec.gif)
![](24055_html_32f8ad77.gif) ![](24055_html_m778f42ce.gif) ![](24055_html_32f8ad77.gif) ![](24055_html_b3e9b.gif)
![](24055_html_m154daf9b.gif) ![](24055_html_3f761644.gif) ![](24055_html_17708c07.gif) ![](24055_html_445b16c7.gif) ![](24055_html_7f86b028.gif)
![](24055_html_39d90315.gif) ![](24055_html_m79381462.gif) ![](24055_html_m283693e0.gif)
![](24055_html_m154daf9b.gif)
![](24055_html_m4d383418.gif) Раскраска таблицы инцидентности после 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
![](24055_html_dfc7d29.gif) ![](24055_html_17708c07.gif)
B E Все остальные ребра графа, не вошедшие в это дерево, являются ребрами касания
D C ![](24055_html_m778f42ce.gif)
![](24055_html_m154daf9b.gif) ![](24055_html_17708c07.gif) ![](24055_html_445b16c7.gif) ![](24055_html_38274841.gif)
G H I F ![](24055_html_m543e29a5.gif)
![](24055_html_m543e29a5.gif) ![](24055_html_m543e29a5.gif) ![](24055_html_m543e29a5.gif) ![](24055_html_m154daf9b.gif)
|
|
|