Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[154]

иск повторяется из нескольких вершин. Говоря дальше о поиске в глубину, мы всегда предполагаем, что так и делается (поиск повторяется). Мы получаем подграф предшествования (predecessor subgraph), определённый так: Gv = (V,EV), где

Подграф предшествования представляет собой лес поиска в глубину (depth-first forest), состоящий из деревьев поиска в глубину (deep-first trees).

Алгоритм поиска в глубину также использует цвета вершин. Каждая из вершин вначале белая. Будучи обнаруженной (discovered), она становится серой; она станет чёрной, когда будет полностью обработана, то есть когда список смежных с ней вершин будет просмотрен. Каждая вершина попадает ровно в одно дерево поиска в глубину, так что эти деревья не пересекаются.

Помимо этого, поиск в глубину ставит на вершинах метки времени (timestamps). Каждая вершина имеет две метки: в d[v] записано, когда эта вершина была обнаружена (и сделана серой), а в f[v] - когда была закончена обработка списка смежных с v вершин (и v стала чёрной).

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

В приводимой далее процедуре DFS (Depth-First Search - поиск в глубину) метки времени d[v] и f[v] являются целыми числами от 1 до 2\V\; для любой вершины и выполнено неравенство

Вершина и будет белой до момента d[u], серой между d[u] и f[u] и чёрной после /[и].

Исходный граф может быть ориентированным или неориентированным. Переменная time - глобальная переменная текущего времени, используемого для пометок.

DFS$(G)$

1for (для) всех вершин $u\in V[G]$

2\hspace{lcm} do $color[u]\leftarrow$ белый

3\hspace{2cm> $\pi[u]\leftarrow NIL$

4$time\leftarrow 0$

5for (для) всех вершин $u\in V[G]$

6\hspace{lcm} do if $color[u]=$ белый

7\hspace{2cm> then DFS-Visit$(u)$

DFS-Visit(u)

1 $color[u]\leftarrow$ белый вершина $u$ была белой

Еж = {(тгН, v) : v е Va,ndir[v] ф NIL}

d[u] < f[u]


Рис. 23.3 23.4 Исполнение алгоритма DFS для ориентированного графа. После просмотра каждое ребро становится либо серым (если оно включается в дерево поиска) или пунктирным (обратные рёбра помечены буквой В (back), перекрёстные - буквой С (cross), прямые - буквой F (forward)). У каждой вершины показаны времена начала и конца обработки.

2$d[u]\leftarrow time\leftarrow time+l$

3\textsc{for} (для) всех $v\in Adj[u]$ обработать ребро $(u,v)$

4\hspace{lcm} \textsc{do if} $color[v]=$ белый

5\hspace{2cm} \textsc{then} $\pi[v]\leftarrow u$

6\hspace{3cm} DFS-Visit$(v)$

7$color[u]\leftarrow$ ч\"~~а5рный вершина обработана, делаем е\"~~а5 чер!

8$f[u]\leftarrow time\leftarrow time+l$

На рис. 23.4 показана работа процедуры DFS на графе рис. 23.2.

В строках 1-3 все вершины красятся в белый цвет; в поле 7г помещается nil. В строке 4 уставливается начальное (нулевое) время. В строках 5-7 вызывается процедура DFS-Visit для всех вершин (которые остались белыми к моменту вызова - предыдущие вызовы процедуры могли сделать их чёрными). Эти вершины становятся корнями деревьев поиска в глубину.

В момент вызова DFS-Visit(m) вершина и - белая. В строке 1 она становится серой. В строке 2 время её обнаружения заносится в d[u] (до этого счётчик времени увеличивается на 1). В строках 3-7 просматриваются смежные с и вершины; процедура DFS-Visit вызывается для тех из них, которые оказываются белыми к моменту вызова. После просмотра всех смежных с и вершин мы делаем вершину и чёрной и записываем в f[u] время этого события.

Подсчитаем общее число операций при выполнении процедуры DFS. Циклы в строках 1-3 и 5-7 требуют О(С) времени (помимо вызовов DFS-Visit). Процедура DFS-Visit вызывается ровно один раз для каждой вершины (ей передаётся белая вершина, и она сразу же делает её серой). Во время выполнения DFS-Visit(u) цикл в строках 3-6 выполняется Аф[и] раз. Поскольку

\Adj[v]\ = Q(E),

vEV

время выполнения строк 3-6 процедуры DFS-Visit составляет ©(E). В сумме получается время ©(С + Е). Свойства поиска в глубину.

Прежде всего отметим, что подграф предшествования (составленный из деревьев поиска в глубину) в точности соответствует структуре рекурсивных вызовов процедуры DFS-Visit. Именно, и = ir[v] тогда и только тогда, когда произошёл вызов DFS-Visit(u) во время просмотра списка смежных с и вершин.


Рис. 23.4 23.5 Свойства поиска в глубину, (а) Результат поиска (в обозначениях рис. 23.4). (Ь) Промежутки между обнаружением и окончанием обработки для каждой из вершин, изображённые в виде прямоугольников. Стрелки указывают структуру деревьев посика в глубину, (с) Отмечены рёбра исходного графа с указанием их типов (рёбра дерева и прямые рёбра ведут вниз, обратные ведут вверх).

Другое важное свойство состоит в том, что времена обнаружения и окончания обработки образуют правильную скобочную структуру (parenthesis structure). Обозначая обнаружение вершины и открывающийся скобкой с пометкой и, а окончание её обработки - закрывающейся с той же пометкой, то перечень событий будет правильно построенным выражением в том смысле (скобки с одинаковыми пометками считаем парными). Например, поиску в глубину на рис. 23.5 (а) соответствует расстановка скобок, изображённая на рисунке 23.5(b).

Чтобы доказать эти и другие свойства, мы должны рассуждать по индукции. При этом, доказывая требуемое свойство рекурсивной процедуры DFS-Visit, мы предполагаем, что рекурсивные вызовы этой процедуры обладают выбранным свойством.

Убедимся вначале, что вызов DFS-Visit(m) для белой вершины и делает чёрной эту вершину и все белые вершины, доступные из неё по белым путям (в которых все промежуточные вершины также белые), и оставляет серые и чёрные вершины без изменений.

В самом деле, рекурсивные вызовы в строке 6 выполняются лишь для белых вершин, являющихся смежными с и. Если какая-то вершина w была закрашена в ходе этих вызовов, то (по индуктивному предположению) она была доступна по белому пути из одной из белых вершин, смежных с и, и потому доступна по белому пути из и.

Напротив, если вершина w доступна по белому пути из и, то этот она доступна по белому пути из какой-то белой вершины v, смежной с и (посмотрим на первый шаг пути). Будем считать, что v - первая из таких вершин (в порядке просмотра в строке 3). В этом случае все вершины белого пути из v в w останутся белыми к моменту вызова DFS-Visit(u), поскольку они недоступны по белым путям из предшествующих v вершин (иначе w была бы также доступна). По индуктивному предположению w станет чёрной после вызова DFS-Visit(u).

Кроме того, сама вершина и станет сначала серой, а потом чёрной. (Заметим, что мы могли бы сразу сделать её чёрной, поскольку программа никак не различает серые и чёрные вершины, однако это различие нам пригодится в дальнейшем.)

Ясно также, что цвета серых и чёрных вершин остаются без изменений (поскольку это верно для рекурсивных вызовов по индуктивному предположению).



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7] [стр.8] [стр.9] [стр.10] [стр.11] [стр.12] [стр.13] [стр.14] [стр.15] [стр.16] [стр.17] [стр.18] [стр.19] [стр.20] [стр.21] [стр.22] [стр.23] [стр.24] [стр.25] [стр.26] [стр.27] [стр.28] [стр.29] [стр.30] [стр.31] [стр.32] [стр.33] [стр.34] [стр.35] [стр.36] [стр.37] [стр.38] [стр.39] [стр.40] [стр.41] [стр.42] [стр.43] [стр.44] [стр.45] [стр.46] [стр.47] [стр.48] [стр.49] [стр.50] [стр.51] [стр.52] [стр.53] [стр.54] [стр.55] [стр.56] [стр.57] [стр.58] [стр.59] [стр.60] [стр.61] [стр.62] [стр.63] [стр.64] [стр.65] [стр.66] [стр.67] [стр.68] [стр.69] [стр.70] [стр.71] [стр.72] [стр.73] [стр.74] [стр.75] [стр.76] [стр.77] [стр.78] [стр.79] [стр.80] [стр.81] [стр.82] [стр.83] [стр.84] [стр.85] [стр.86] [стр.87] [стр.88] [стр.89] [стр.90] [стр.91] [стр.92] [стр.93] [стр.94] [стр.95] [стр.96] [стр.97] [стр.98] [стр.99] [стр.100] [стр.101] [стр.102] [стр.103] [стр.104] [стр.105] [стр.106] [стр.107] [стр.108] [стр.109] [стр.110] [стр.111] [стр.112] [стр.113] [стр.114] [стр.115] [стр.116] [стр.117] [стр.118] [стр.119] [стр.120] [стр.121] [стр.122] [стр.123] [стр.124] [стр.125] [стр.126] [стр.127] [стр.128] [стр.129] [стр.130] [стр.131] [стр.132] [стр.133] [стр.134] [стр.135] [стр.136] [стр.137] [стр.138] [стр.139] [стр.140] [стр.141] [стр.142] [стр.143] [стр.144] [стр.145] [стр.146] [стр.147] [стр.148] [стр.149] [стр.150] [стр.151] [стр.152] [стр.153] [стр.154] [стр.155] [стр.156] [стр.157] [стр.158] [стр.159] [стр.160] [стр.161] [стр.162] [стр.163] [стр.164] [стр.165] [стр.166] [стр.167] [стр.168] [стр.169] [стр.170] [стр.171] [стр.172] [стр.173] [стр.174] [стр.175] [стр.176] [стр.177] [стр.178] [стр.179] [стр.180] [стр.181] [стр.182] [стр.183] [стр.184] [стр.185] [стр.186] [стр.187] [стр.188] [стр.189] [стр.190] [стр.191] [стр.192] [стр.193] [стр.194] [стр.195] [стр.196] [стр.197] [стр.198] [стр.199] [стр.200] [стр.201] [стр.202] [стр.203] [стр.204] [стр.205] [стр.206] [стр.207] [стр.208] [стр.209] [стр.210] [стр.211] [стр.212] [стр.213] [стр.214] [стр.215] [стр.216] [стр.217] [стр.218] [стр.219] [стр.220] [стр.221] [стр.222] [стр.223] [стр.224] [стр.225] [стр.226] [стр.227] [стр.228] [стр.229] [стр.230] [стр.231] [стр.232] [стр.233] [стр.234] [стр.235] [стр.236] [стр.237] [стр.238] [стр.239] [стр.240] [стр.241] [стр.242] [стр.243] [стр.244] [стр.245] [стр.246] [стр.247] [стр.248] [стр.249] [стр.250] [стр.251] [стр.252] [стр.253] [стр.254] [стр.255] [стр.256] [стр.257] [стр.258] [стр.259] [стр.260] [стр.261] [стр.262] [стр.263] [стр.264] [стр.265] [стр.266] [стр.267] [стр.268] [стр.269] [стр.270] [стр.271] [стр.272] [стр.273] [стр.274] [стр.275] [стр.276] [стр.277] [стр.278] [стр.279] [стр.280] [стр.281] [стр.282] [стр.283] [стр.284] [стр.285] [стр.286] [стр.287] [стр.288] [стр.289] [стр.290] [стр.291] [стр.292] [стр.293] [стр.294]