- •Введение
- •Неориентированные графы
- •Основные определения
- •Маршруты, циклы и связность
- •Ориентированные графы
- •Основные определения
- •Маршруты и связность в ориентированных графах
- •Структуры данных для представления графа
- •Матричное представление графов
- •Матрица инциденций
- •Матрица циклов
- •Матрица разрезов
- •Матрица смежности вершин
- •Матрица путей
- •Представление графов в виде списков
- •Упорядоченные графы
- •Задачи нахождения путей в графах
- •Алгоритм вычисления стоимости прохождения между узлами
- •Алгоритм
- •Алгоритм нахождения кратчайшего пути
- •Задачи с одним источником
- •Алгоритм Дейкстры
- •Метод поиска в глубину
- •Алгоритм поиска в глубину на неориентированном графе
- •Поиск в глубину в ориентированном графе
- •Вычислительная сложность алгоритмов
- •Библиографический список
- •Оглавление
Алгоритм поиска в глубину на неориентированном графе
Вход. Граф G = (V, E), представленный списками смежности узлов: L(v) v V.
Выход. Разбиение множества E на два подмножества: древесных ребер T и обратных ребер B.
Метод. Рекурсивная процедура Поиск(v) добавляет к T ребро (v, w), если узел w был впервые достигнут во время прохождения по ребру из v. Все узлы вначале помечены как «новые».
T = .
Выбираем произвольный узел v V. Помечаем его как “новый”.
Пока существует v V, помеченный как “новый”, выполняем процедуру Поиск(v).
Процедура Поиск(v):
Пометить узел v как «старый».
Для любого узла w L(v) делать:
Если узел w – «новый», то
Добавить ребро (v, w) к T
Поиск(w)
Все ребра множества E, не попавшие в T, относятся к множеству B.
Пример работы алгоритма поиска в глубину на неориентированном графе представлен на рис. 17.
Обычно ребра, входящие в T, изображают сплошными линиями, а ребра из B – пунктирными. Корень (то есть вершину, выбранную за начало поиска) рисуют сверху, а сыновей располагают слева направо в порядке их прохождения (рис. 17).

а) б)
Рис. 17. Неориентированный граф (а) и глубинный остовный лес для него (б)
Поиск в глубину в ориентированном графе
Рассмотренный алгоритм поиска можно использовать, чтобы находить ориентированный остовный лес для ориентированного графа G = (V, E), если определить список L(v) узлов, «смежных» с узлом v как список узлов, которые являются концами ребер с началом в узле v. То есть, L(v) = {w: (v, w) E}. Пример представлен на рис. 18.
В процессе поиска в глубину на ориентированном графе в дополнение к древесным ребрам возникает еще три типа ребер. Это обратные ребра (например, (v3, v1)), поперечные справа налево (например, (v4, v3)) и прямые ребра (например, (v1, v4)).
Но никакое ребро не идет из узла с меньшим номером, присвоенным в процессе поиска в глубину, в узел с большим номером, если только последнее не является потомком первого. Это не случайно.
Пусть (v, w) – ребро, и узел v был впервые посещен до w (то есть v < w). Каждый узел, которому присваивается номер в период между началом и концом процедуры Поиск(v), становятся потомком узла v. Но узел w должен получить свой номер, когда рассматривается ребро (v, w), если только он уже не получил номер раньше. Если w получает номер, когда рассматривается ребро (v, w), то (v, w) становится древесным ребром, иначе – прямым. Таким образом, не может быть такого поперечного ребра (v, w), что v < w.
а)
б)
Рис. 18. Ориентированный граф (а) и ориентированный глубинный остовный лес для него (б)
Поиск в глубину в ориентированном графе G = (V, E) разбивает множество его ребер на 4 класса:
Древесные ребра, идущие к новым узлам в процессе поиска.
Прямые ребра, идущие от предков к подлинным потомкам, но не являющиеся древесными ребрами.
Обратные ребра, идущие от потомков к предкам (возможно из узла в себя).
Поперечные ребра, соединяющие узлы, которые не являются ни предками, ни потомками друг друга.
