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

39. Поиск в ширину в графе

Теперь рассмотрим несколько иной метод поиска в графе, называемый поиском в ширину(англ.:Breadth first search). Прежде чем описать его, отметим, что при поиске в глубину, чем позднее будет посещена вершина, тем раньше она будет использована - точнее, так будет при допущении, что вторая вершина посещается перед использованием первой. Это прямое следствие того факта, что просмотренные, но ещё не использованные вершины скапливаются в стеке. Поиск в ширину, грубо говоря, основывается на замене стека очередью. После такой модификации чем раньше посещается вершина (помещается в очередь),тем раньше она используется (удаляется из очереди).Использование вершины происходит с помощью просмотра сразу всех ещё не просмотренных соседей этой вершины. Вся процедура представлена ниже

Procedure WG1[v];

(*поиск в ширину в графе с началом в вершине v;*);

Переменные НОВЫЙ, ЗАПИСЬ – глобальные*)

Begin

ОЧЕРЕДЬ:=0; ОЧЕРЕДЬ←v; НОВЫЙ[v]:=ложь

While ОЧЕРЕДЬ≠0 do

Begin P←ОЧЕРЕДЬ; посетить р

For u ЗАПИСЬ[p] do

If НОВЫЙ [u] then

Begin ОЧЕРЕДЬ ← u; НОВЫЙ [u]:=ложь

End

End

End

Способом, аналогичным тому, какой был применён для поиска в глубину, можно легко показать, что вызов процедуры WS(u) приводит к посещению всех вершин связной компоненты графа, содержащей вершину U, причём каждая вершина просматривается в точности один раз. Вычислительная сложность поиска в ширину также имеет порядок M+n, так как каждая вершина помещается в очередь и удаляется из очереди в точности один раз, а число итераций цикла 6,очевидно, будет иметь порядок числа ребер графа. Оба вида поиска в графе:в глубину и в ширину могут быть использованы для нахождения пути между фиксированными вершинами V и U. Достаточно начать поиск в графе с вершины V и вести его до момента посещения вершины U. Преимуществом поиска в глубину является тот факт, что в момент посещения вершины U стек содержит последовательность вершин, определяющую путь из V в U. Это становится очевидным, если отметить, что каждая вершина, помещается в стек. Однако недостатком поиска в глубину является то, что полученный таким образом путь в общем случае не будет кратчайшим путем из V в U.

От этого недостатка избавлен метод нахождения пути, основанный на поиске в ширину. Модификация процедуры WS, замена строк 7..9 на

If НОВЫЙ [u] then

Begin ОЧЕРЕДЬ ← u; НОВЫЙ [u]:=ложь;

ПРЕДЫДУЩИЙ [u]:=p

end

По окончании работы модифицированной таким образом процедуры таблица ПРЕДЫДУЩИЙ содержит для каждой просмотренной вершины u вершину ПРЕДЫДУЩИЙ(U),из которой мы попали в u. Отметим, что кратчайший путь из U в v обозначается последовательностью вершин u=u1, u2,...,uk=v, где ui+1=ПРЕДЫДУЩИЙ[ui] для 1<=i<k и к является первым индексом i, для которого ui=v. Действительно, в очереди помещены сначала вершины, находящиеся на расстоянии 1 от v, и т.д. Под расстоянием здесь мы понимаем длину кратчайшего пути. Предположим теперь, что мы уже рассмотрели все вершины, находящиеся на расстоянии, не превосходящем r,от V, что очередь содержит все вершины, находящиеся от V на расстоянии r ,и только эти вершины и что таблица ПРЕДЫДУЩИЙ правильно определяет кратчайший путь от каждой, уже просмотренной вершины до V способом, описанным выше. Использовав каждую вершину r, находящёюся в очереди, наша процедура просматривает некоторые новые вершины, и каждая такая новая вершина u находится, очевидно, на расстоянии r+1 от V причем, определяя предыдущий [u]:=p, мы продлеваем кратчайший путь от р до v до кратчайшего пути от u до V .После использования всех вершин из очереди, находящихся на расстоянии r от V,она(очередь),очевидно, содержит множество вершин, находящихся на расстоянии r+1 от v,и легко заметить, что условие индукции выполняется и для расстояния r+1.