Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпоры ОАиП(теория).docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
151.01 Кб
Скачать

40. Поиск в глубину в графе

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

(а) он позволяет алгоритму решения интересующей вас задачи легко погрузиться в этот метод и

(б) каждое ребро графа анализируется не более одного раза (или, что существенно не меняет ситуации, число раз, ограниченное константой).

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

Общая идея этого метода состоит в следующем. Мы начинаем поиск с некоторой фиксированной вершины v0. Затем выбираем произвольную вершину u, смежную с v0, и повторяем наш процесс от u. В общем случае предположим, что мы находимся в вершине v. Если существует новая (еще не просмотренная) вершина u, u-v, то мы рассматриваем эту вершину (она перестаёт быть новой) и, начиная с нее, продолжаем поиск. Если же не существует ни одной новой вершины, смежной с v, то мы говорим, что вершина v использована, возвращаемся в вершину, из которой мы попали в v, и продолжаем процесс (если v=v0), то поиск закончен). Другими словами, поиск в глубину из вершины v основывается на поиске в глубину из всех вершин, смежных с v.

В связи с тем что поиск в глубину играет важную роль в проектировании алгоритмов на графах, представим также нерекурсивную версию процедуры WG. Рекурсия устраняется стандартным способом при помощи стека. Каждая просмотренная вершина помещается в стек и удаляется из стека после использования.

Procedure WG1[v];

(*поиск в глубину в графе, начиная с вершины v – нерекурсивная версия процедуры WG, предполагаем, что в начале процесса поиска Р[u] = указатель на первую запись списка ЗАПИСЬ[u] для каждой вершины; массивы Р, НОВЫЙ – глобальные*)

Begin СТЕК:=О; СТЕК ← v; рассмотреть v

НОВЫЙ[v]:=ложь;

While СТЕК≠0 do

Begin t:=top(СТЕК); (*t – верхний элемент стека *)

(*найти первую новую вершину в списке ЗАПИСЬ[t]*)

If P[t]=nil then b:=ложь

Else b:=not НОВЫЙ [P[t)↑.строка];

While b do

Begin P[t]:=P[t] ↑ след;

If P[t]=nil then b:=ложь

Else b:=not НОВЫЙ [P[t)↑. строка];

End;

If P[t] ≠nil then (* найдена новая вершина *

Begin t:= [P[t)↑. Строка; СТЕК ← t;

Рассмотреть t; НОВЫЙ [t]:=ложь

end

else (* вершина t использована*)

t ← (*удалить верхний элемент стека*)

end

end

Корректность этой процедуры можно доказать путем незначительной модификации анализа процедуры WG.