Шаг 194.
Основы языка Haskell.
Реализация алгоритмов на графах... . Поиск в ширину на графе

    На этом шаге мы рассмотрим реализацию этого алгоритма.

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

    Обход графа в ширину основывается на замене стека очередью. После такой модификации, чем раньше посещается вершина (помещается в очередь), тем раньше она используется (удаляется из очереди). Использование вершины происходит с помощью просмотра сразу всех ещё непросмотренных вершин, смежных этой вершине. Таким образом, "поиск ведётся как бы во всех возможных направлениях одновременно" [1, с.131].

    Механизм работы алгоритма обхода в ширину становится ясным из рассмотрения бинарного дерева поиска для следующего графа (порядок обхода графа задан цифрами рядом с кружками):


Рис.1. Пример дерева для обхода в ширину

    Приведем программу, реализующую обход в ширину.

Раскрыть/скрыть текст примера.

    Библиотека для работы с графами, представленными ассоциативными списками смежности.

Раскрыть/скрыть текст библиотеки.

Все файлы можно взять здесь.

    При поиске в ширину ближайшие соседи последней просмотренной вершины добавляются в конец списка queue операцией:

   queue ++ (neighbour (head queue) graph),
в то время как новые вершины для просмотра берутся из начала этого списка, в который они помещаются с помощью операции
  (head queue): visited,
т.е. параметр queue представляет собой очередь в отличие от параметра path функции defi, который работает как стек. Это приводит к тому, что в процессе работы функции brfi просмотренные вершины в списке visited расположены в порядке невозрастания их расстояния от начальной вершины root.
(1)Крюков А.П., Радионов А.Я., Таранов А.Ю., Шаблыгин Е.М. Программирование на языке R-Лисп. - М.: Радио и связь, 1991. - 192 с.

    На следующем шаге мы рассмотрим нерекурсивный алгоритм поиска в ширину на графе.




Предыдущий шаг Содержание Следующий шаг