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

    На этом шаге мы рассмотрим организацию поиска в глубину.

    Поиск в глубину на графе основан на таком порядке просмотра вершин графа, когда новая вершина, пока это возможно, выбирается среди соседей текущей вершины.

    Если среди соседей текущей вершины нет таких, что не были просмотрены ранее, то мы возвращаемся к предыдущей вершине и возобновляем поиск.

    Приведем пример реализации обхода графа в глубину.

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

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

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

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

    Программа работает следующим образом.

    Если граф не пуст, то в два списка (visited - список уже просмотренных вершин и path - список вершин, определяющих путь просмотра) заносится первая вершина графа. После этого вызывается функция defi, третий аргумент которой (список path) позволяет в любой момент вернуться к предыдущей вершине. Список visited используется для того, чтобы помнить о том, какие вершины уже пройдены.

    Выбор следующей вершины осуществляется с помощью функции expnd. Именно работой этой функции определяется порядок просмотра графа.

    В нашем случае, пока возможно, для просмотра выбирается соседняя вершина, т.е. на каждом шаге алгоритма делается попытка пройти вглубь графа. В противном случае из списка path удаляется первый элемент, и поиск возобновляется с предыдущей вершины.

    Значением функции depthFirst является список вершин графа в том порядке, в котором эти вершины были просмотрены. Очевидно, что этот порядок зависит от вершины, с которой просмотр начинается.

    Более того, для некоторых графов списки просмотренных вершин, полученные при различных значениях начальной вершины, вообще не имеют ни одного общего элемента.


(1)Крюков А.П., Радионов А.Я., Таранов А.Ю., Шаблыгин Е.М. Программирование на языке R-Лисп. - М.: Радио и связь, 1991. - 192 с.

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




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