Обход в ширину — различия между версиями
(→Реализация) |
(→Реализация) |
||
Строка 13: | Строка 13: | ||
Приведенная ниже процедура поиска в ширину '''BFS''' предполагает, что входной граф <tex>G = (V, E)</tex> представлен при помощи списков смежности. Кроме того, поддерживаются дополнительные структуры данных в каждой вершине графа. Цвет каждой вершины <tex>u \in V</tex> хранится в переменной <tex>color[u]</tex>, а предшественник — в переменной <tex>p[u]</tex>. Если предшественника у <tex>u</tex> нет, то <tex>p[u] =</tex> NIL. Расстояние от <tex>s</tex> до вершины <tex>u</tex>, вычисляемое алгоритмом, хранится в поле <tex>d[u]</tex>. Алгоритм использует очередь <tex>Q</tex> для работы с множеством серых вершин. | Приведенная ниже процедура поиска в ширину '''BFS''' предполагает, что входной граф <tex>G = (V, E)</tex> представлен при помощи списков смежности. Кроме того, поддерживаются дополнительные структуры данных в каждой вершине графа. Цвет каждой вершины <tex>u \in V</tex> хранится в переменной <tex>color[u]</tex>, а предшественник — в переменной <tex>p[u]</tex>. Если предшественника у <tex>u</tex> нет, то <tex>p[u] =</tex> NIL. Расстояние от <tex>s</tex> до вершины <tex>u</tex>, вычисляемое алгоритмом, хранится в поле <tex>d[u]</tex>. Алгоритм использует очередь <tex>Q</tex> для работы с множеством серых вершин. | ||
'''BFS'''(<tex>G</tex>, <tex>s</tex>) | '''BFS'''(<tex>G</tex>, <tex>s</tex>) | ||
− | 1 '''for''' (для) каждой вершины <tex>u \in V[G] | + | 1 '''for''' (для) каждой вершины <tex>u \in V[G]</tex> |
2 '''do''' <tex>color[u] \leftarrow</tex> WHITE | 2 '''do''' <tex>color[u] \leftarrow</tex> WHITE | ||
3 <tex>d[u] \leftarrow \mathcal {1}</tex> | 3 <tex>d[u] \leftarrow \mathcal {1}</tex> | ||
4 <tex>p[u] \leftarrow</tex> NIL | 4 <tex>p[u] \leftarrow</tex> NIL | ||
5 <tex>color[s] \leftarrow</tex> GRAY | 5 <tex>color[s] \leftarrow</tex> GRAY | ||
− | 6 <tex>d[s] \leftarrow</tex> | + | 6 <tex>d[s] \leftarrow 0</tex> |
7 <tex>p[s] \leftarrow</tex> NIL | 7 <tex>p[s] \leftarrow</tex> NIL | ||
− | 8 <tex>Q \leftarrow</tex> | + | 8 <tex>Q \leftarrow \varnothing</tex> |
9 ENQUEUE(<tex>Q</tex>, <tex>s</tex>) | 9 ENQUEUE(<tex>Q</tex>, <tex>s</tex>) | ||
− | 10 '''while''' <tex>Q \ne </tex> | + | 10 '''while''' <tex>Q \ne \varnothing</tex> |
11 '''do''' <tex>u \leftarrow</tex> DEQUEUE(<tex>Q</tex>) | 11 '''do''' <tex>u \leftarrow</tex> DEQUEUE(<tex>Q</tex>) | ||
12 '''for''' (для) каждой <tex>м \in Adj[u]</tex> | 12 '''for''' (для) каждой <tex>м \in Adj[u]</tex> |
Версия 05:57, 21 января 2011
Обход в ширину (Поиск в ширину, BFS, Breadth-first search) — один из простейших алгоритмов обхода графа, являющийся основой для многих важных алгоритмов для работы с графами. Например, алгоритм Прима поиска минимального остовного дерева или алгоритм Дейкстры поиска кратчайшего пути из одной вершины используют идеи, сходные идеям, используемым при поиске в ширину.
Содержание
Алгоритм
Общая идея
Пусть задан граф
и выделена исходная вершина . Алгоритм поиска в ширину систематически обходит все ребра для "открытия" всех вершин, достижимых из , вычисляя при этом расстояние (минимальное количество ребер) от до каждой достижимой из вершины. Кроме того, в процессе обхода строится "дерево поиска в ширину" с корнем , содержащее все достижимые вершины. Для каждой достижимой их вершины путь в дереве поиска в ширину соответствует кратчайшему пути от до в .Для отслеживания работы алгоритма поиск в ширину раскрашивает вершины графа в белый, серый и черный цвета. Изначально все вершины белые, и позже они могут стать серыми, а затем черными. Когда вершина открывается в процессе поиска, она окрашивается. Таким образом, серые и черные вершины — это вершины, которые уже были открыты, но алгоритм поиска в ширину по-разному работает с ними, чтобы обеспечить объявленный порядок обхода. Если
и вершина черного цвета, то вершина либо серая, либо черная, т.е. все вершины, смежные с ней уже открыты. Серые вершины могут иметь белых соседей, представляя собой границу между открытыми и неоткрытыми вершинами.Поиск в ширину строит дерево поиска в ширину, которое изначально состоит из одного корня, которым является исходная вершина
. Если в процессе сканирования списка смежности уже открытой вершины открывается белая вершина , то вершина и ребро добавляются в дерево. При этом является предшественником (predecessor), или родителем (parent), в дереве поиска в ширину. Поскольку вершина может быть открыта не более одного раза, она имеет не более одного родителя.Реализация
Приведенная ниже процедура поиска в ширину BFS предполагает, что входной граф
представлен при помощи списков смежности. Кроме того, поддерживаются дополнительные структуры данных в каждой вершине графа. Цвет каждой вершины хранится в переменной , а предшественник — в переменной . Если предшественника у нет, то NIL. Расстояние от до вершины , вычисляемое алгоритмом, хранится в поле . Алгоритм использует очередь для работы с множеством серых вершин.BFS(, ) 1 for (для) каждой вершины 2 do WHITE 3 4 NIL 5 GRAY 6 7 NIL 8 9 ENQUEUE( , ) 10 while 11 do DEQUEUE( ) 12 for (для) каждой 13 do if WHITE 14 then GRAY 15 16 17 ENQUEUE( , ) 18 BLACK
Анализ
Оценим время работы для входного графа
. После инициализации ни одна вершина не окрашивается в белый цвет, поэтому проверка в строке 13 гарантирует, что каждая вершина вносится в очередь не более одного раза, а следовательно, и удаляется из очереди она не более одного раза. Операции внесения в очередь и удаления из нее требуют времени, так что общее время операций с очередью составляет . Поскольку каждый список смежности сканируется только при удалении соответствующей вершины из очереди, каждый список сканируется не более одного раза. Так как сумма длин всех списков смежности равна , общее время, необходимое для сканирования списков, равно . Накладные расходы на инициализацию равны , так что общее время работы процедуры BFS составляет . Таким образом, время работы поиска в ширину линейно зависит от размера представления графа с использованием списков смежности.Литература
- Томас Х. Кормен и др. Алгоритмы: построение и анализ = INTRODUCTION TO ALGORITHMS. — 2-е изд. — М.: «Вильямс», 2006. — С. 1296. — ISBN 0-07-013151-1