Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
инф-госы теория и практика.doc
Скачиваний:
28
Добавлен:
29.08.2019
Размер:
3.77 Mб
Скачать

15. Поиск в ширину

задача анализа гра­фов с целью выявления их структуры и вычисления метрических харак­теристик: многие задачи такого рода могут быть решены путем система­тического обхода графа с посещением всех его вершин и исследованием всех его ребер. Такой обход можно выполнить двумя стратегиями — поиск в глубину и поиск в ширину.

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

Идея поиска в ширину состоит в том, чтобы посещать вершины в порядке их удаленности от некоторой заранее выбранной или указанной стартовой вершины. Иначе говоря, сначала посещается сама вершина а, затем все вершины, смежные с а, то есть находящиеся от нее на расстоя­нии 1, затем вершины, находящиеся от а на расстоянии 2, и т. д.

Рассмотрим алгоритм поиска в ширину с заданной стартовой вер­шиной а. Вначале все вершины помечаются как новые. Первой посе­щается вершина а, она становится единственной открытой вершиной. В дальнейшем каждый очередной шаг начинается с выбора некоторой от­крытой вершины х. Эта вершина становится активной. Далее исследуют­ся ребра, инцидентные активной вершине. Если такое ребро соединяет вершину х с новой вершиной у, то вершина у посещается и превращается в открытую. Когда все ребра, инцидентные активной вершине, исследо­ваны, она перестает быть активной и становится закрытой. После этого выбирается новая активная вершина, и описанные действия повторяют­ся. Процесс заканчивается, когда множество открытых вершин становит­ся пустым.

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

Обходом графа называется перебор его вершин в определенном порядке

Существует 2 метода обхода графов - поиск в ширину и поиск в глубину.

Поиск в ширину представляет собой следующий просмотр вершин графа:

A) Выбирается произвольная начальная вершина v.

B) Просматриваются вершины, находящиеся на расстоянии 1 от V (смежные с v). затем просматриваются непросмотренные вершины на расстоянии 2 от v (смежные со смежными) и т.д.

Запишем алгоритм.

ВХОД - начальная вершина v., C - матрица смежности графа.

Перед запуском процедуры выполним:

for i:=1 to n do lab[i]:=true; //все вершины помечаем, как непроcмотренные.

procedure shfind(v); begin

ОЧЕРЕДЬ:= ; ОЧЕРЕДЬ<=v; //ОЧЕРЕДЬ – есть упор. список

while ОЧЕРЕДЬ<> do begin

p<=ОЧЕРЕДЬ; посетить p; lab[p]:=false; //посещаем и помечаем ее, как просмотренную.

for u:=1 to n do if (([p,u]=1)or (c[u,p]=1))and lab[u] then ОЧЕРЕДЬ<=u/;/все смежные непосещенные вершин помещаем в очередь.

end;end;

Процедура поиска в глубину

Идея этого метода — идти вперед в неисследованную область, пока это возможно, если же вокруг все исследовано, отступить на шаг назад и искать новые возможности для продвижения вперед

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

Обход начинается с посещения заданной стартовой вершины a, ко­торая становится активной и единственной открытой вершиной. Затем выбирается инцидентное вершине а ребро (а,у) и посещается вершина у. Она становится открытой и активной. Заметим, что при поиске в шири­ну вершина а оставалась активной до тех пор, пока не были исследованы все инцидентные ей ребра. В дальнейшем, как и при поиске в ширину каждый очередной шаг начинается с выбора активной вершины из мно­жества открытых вершин. Если все ребра, инцидентные активной вер­шине х, уже исследованы, она превращается в закрытую. В противном случае выбирается одно из неисследованных ребер (х,у), это ребро ис­следуется. Если вершина у новая, то она посещается и превращается в открытую.

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

Поиск в глубину предполагает рассмотрение вершин в следующем порядке:

A) Просматриваем произвольную нач. вершину v.

B) Рекурсивно вызываем поиск в глубину для всех смежных с v и еще непросмотренных вершин. При этом массив меток должен быть глобальным и пред вызовом все lab[i]:=true.

Алгоритм.

procedure gfind(v); begin

lab[v]:=false; посетить v;

for u:=1 to n if (([v,u]=1)or (c[v,p]=1))and lab[u] then gfind(u)

end;

Замеч 1. Обходы графа позволяют решать многие конкретные задачи.

Замеч 2. Для обоих способов обхода - T~ekn - экспоненциальный (док-во опускается).