- •Глава I Основные понятия
- •§1. Введение
- •§2. Алгоритмы и их сложности
- •§3. Запись алгоритмов
- •Глава II Графы и сети
- •§1. Графы, сети
- •§2. Машинное представление графов и сетей.
- •Глава III Сортировка данных
- •§1. Сложность задачи сортировки
- •§2. Алгоритм сортдерево
- •Глава IV Поиск в графе
- •§1. Поиск в глубину.
- •§2. Поиск в ширину.
- •§3. Цепи и пути в графах.
- •§4. Пути в лабиринте.
- •Глава V Задача о минимальном остове
- •Глава VI Пути в сетях
- •§1 Общий случай. Алгоритм Форда-Беллмана.
- •§2 Случай неотрицательных весов. Алгоритм Дейкстры.
- •§3. Случай бесконтурной сети.
- •§4. Задача о максимальном пути и сетевые графики.
- •§3. Задача о maxmin пути.
- •§6. Задача о кратчайших путях между всеми парами узлов.
§2. Поиск в ширину.
Другое название этого популярнейшего метода — волновой алгоритм. Причины появления такого названия станут ясны из дальнейшего.
Поиск в ширину начинается с некоторой фиксированной вершины v, называемой корнем. Вершину v считаем просмотренной и помещаем ее в организуемую нами очередь. Считаем также, что вершина v образует нулевой фронт распространения волны.
Затем проходим все ребра {v,w}, инцидентные v, в каком-нибудь порядке и ориентируем их из v в w. Вершины w, смежные с v, считаем просмотренными и размещаем их в порядке просмотра ребер в очередь. Для всех таких вершин w полагаем OTEЦ [w]:=v и говорим, что w просмотрена из v. Ориентированные ребра (v,w) будем называть ребрами ПВШ(v)-дерева. Говорят часто, что все такие вершины w образуют первый фронт распространения волны. Вершина v после этих действий считается использованной и удаляется из очереди.
Дальнейший поиск продолжается следующим образом. Берем очередную вершину v из очереди, проходим по всем ребрам, инцидентным v, которые соединяют вершину v с еще непросмотренными вершинами w. Все такие вершины w объявляются просмотренными, для них полагают OTEЦ[w]:=v, ребра (v,w) относят к ПВШ(v)-дереву. После этих действий вершина v считается использованной и удаляется из очереди. Говорят также, что вершины, просмотренные из вершин, принадлежащих фронту с номером k, образуют (k+1)-ый фронт распространения волны.
Завершается поиск в ширину с корнем в заданной вершине таким же образом, как и поиск в глубину, а именно тогда, когда ни одной новой вершины просмотреть не удается.
На рисунке 4.2 показано, как поиск в ширину исследует графG, изображенный ранее на рис.4.1. Дуги ПВШ-деревьев изображены стрелками в соответствии с ориентацией, полученной в ходе поиска. Прочие ребра исходного графа изображены пунктиром. Предполагалось, что вершины в ходе поиска просматривались в порядке возрастания их номеров.
Отметим, что в ПВШ(1) - дереве поиска вершины 2, 3, 4 образуют первый фронт распространения волны, вершины 5, 6 и 7 — второй, а вершина 8 — третий.
АЛГОРИТМ 4.2. ПОИСК В ШИРИНУ
Данные: неориентированный граф G=(V,E), заданный списками смежностей.
Результаты: массив ОТЕЦ, множество D.
procedure
ПВШ(v); (*
поиск в ширину с корнем v
*)
begin
ОЧЕРЕДЬ :=Ø;
ОЧЕРЕДЬ
v;
METKA[v]:=1;
while
ОЧЕРЕДЬ
≠Ø
do
begin
u
ОЧЕРЕДЬ;
ОЧЕРЕДЬ;
for
w
ЗАПИСЬ[u]
do
(* используем
вершину u
*)
if
METKA[w]=0
then
begin
ОЧЕРЕДЬ
w;
OTEЦ[w]:=u;
METKA[w]:=1;
D=Du{(u,w)};
end;
end;
end;
begin (*главная
программа*)
D:=Ø;
for
vV
do
METKA[v]:=0;
(*
инициализация
*)
for
v
V do
if
METKA[v]=0 then
(*v – корень*)
begin
OTEЦ([v]:=nil;
ПВШ(v);
end;
end.
В приведенном формальном описании алгоритма поиска в ширину переменная МЕТКА имеет тот же смысл, что и ранее в алгоритме 4.1. Дуги ПВШ-деревьев хранятся в множестве D. Смысл переменной ОТЕЦ объяснен выше. Просмотренные вершины помещаются в ОЧЕРЕДЬ и удаляются оттуда сразу после их использования (строка 4 алгоритма). В алгоритме 4.2 связность графа не предполагается. Для корневых вершин поиска и только для них выполняется равенство ОТЕЦ[v]=nil.
Точно также как и ранее теорема 4.1 доказывается
Теорема 4.2. Алгоритм 4.2 ПОИСК В ШИРИНУ имеет вычислительную сложность O(n+m).