Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Дискретка_Экзамен_Ответы / графы / 4 поиск в глубину и в ширину

.docx
Скачиваний:
65
Добавлен:
11.03.2015
Размер:
30.67 Кб
Скачать

4.11. Поиcк в орграфе

Задача 1. Система состоит из конечного числа объектов. Между некоторыми из них установлены одно- или двусторонние каналы связи. Определить, каким объектам системы может передать сообщение по каналам связи заданный объект.

Решение. Рассматриваемую систему можно представить орграфом, в котором вершины соответствуют объектам, а дуги – каналам связи. Объект, соответствующий вершине vi, может передать сообщение объекту, соответствующему вершине vj, если в орграфе существует путь из vi в vj, т.е. если вершина vj достижима из vi. Пусть заданному объекту соответствует вершина vi. Тогда для решения задачи необходимо найти все вершины орграфа, достижимые из vi. Процесс нахождения вершин, достижимых из заданной, называется поиском в орграфе.

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

1. Посещаем начальную вершину vi и считаем её текущей.

2. Если vt – текущая вершина, vj – вершина, смежная вершине vt и ещё не посещалась, то посещаем её и считаем текущей.

3. Если исходная вершина vi – текущая вершина и все смежные с ней уже посещались, то поиск заканчивается.

4. Если vt – текущая вершина и все смежные с ней уже посещались, то текущей считаем вершину, из которой пришли в вершину vt.

Процесс поиска в глубину можно представить как построение ориентированного дерева, корнем которого является начальная вершина орграфа, остальные вершины дерева – вершины орграфа, достижимые из начальной. Дуги дерева соответствуют дугам орграфа, по которым осуществлялось “движение” во время поиска. На рис.4.28 представлен орграф, а на рис.4.29 – дерево поиска в глубину с начальной вершиной 1. Нижний индекс около номера вершины дерева определяет порядок посещения вершин.

Для программной реализации метода поиска в глубину можно использовать рекурсивный или итеративный алгоритм. В алгоритмах используется множество V’ вершин, достижимых из начальной. В исходном состоянии оно содержит только начальную вершину. В итеративном алгоритме для запоминания вершин, предшествующих текущей, используется стек. Дерево поиска можно сохранить в массиве T, количество элементов которого равно количеству вершин орграфа. Элемент Ti представляет собой вершину, предшествующую вершине i в дереве.

Если вершина i – корень дерева, то Ti=0. Если вершина i недостижима из начальной, Ti=-1. В исходном состоянии элемент массива T, соответствующий начальной вершине, равен 0, а все остальные равны -1.

1 2 3

4 5 6

7 8 9

Рис.4.28. Диаграмма графа

11

22 48

33 79

54

65 86

97

Рис.4.29. Дерево поиска в глубину

Рекурсивный алгоритм 4.9 (рис.4.30) поиска в глубину.

Вход: v – текущая вершина.

Выход: последовательность вершин орграфа в порядке их посещения в процессе поиска в глубину (начальная вершина выводится перед первым обращением);

T – дерево поиска в глубину.

Глобальные параметры: V – множество вершин, достижимых из начальной.

Поиск в глубину(v)

xГ(v)-V’

x

V’ :=V’{v}

Tx := v

Поиск в глубину( x)

Конец

Рис.4.30. Рекурсивный алгоритм поиска в глубину

Итеративный алгоритм 4.10 (рис.4.31) поиска в глубину.

Вход: v –начальная вершина.

Выход: последовательность вершин орграфа в порядке их посещения в процессе поиска в глубину;

T – дерево поиска в глубину.

Поиск в глубину(v)

v

V’ :={v}

Tv := 0

поместить

v в стек

v:=верх стека

+

i=k

x

V’ :=V’{v}

извлечь из стека

Tx := v

поместить

x в стек

стек пуст

Конец

Рис.4.31. Итеративный алгоритм поиска в глубину

Задача 2. Система состоит из конечного числа объектов. Между некоторыми из них установлены одно- или двусторонние каналы связи. Определить пути передачи сообщения по каналам связи от заданного объекта ко всем достижимым, содержащие минимальное число промежуточных объектов.

Решение. Рассматриваемую систему можно представить орграфом, в котором вершины соответствуют объектам, а дуги – каналам связи. Пути передачи сообщения от заданного объекта ко всем достижимым можно представить деревом поиска. Поиск в глубину не позволяет найти пути, содержащие минимальное число промежуточных объектов. Для нахождения таких путей используется поиск в ширину.

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

1. Посещаем начальную вершину vi и считаем её текущей.

2. Если vt – текущая вершина, Г(vt) – множество вершин, смежных с vt, то вершины из множества Г(vt), которые ещё не посещались, последовательно посещаем, а вершину, которую посетили вслед за vt, считаем текущей.

3. Если vt – последняя вершина, которая посещалась при поиске, является текущей и все вершины, смежные с ней, уже посещались, то поиск заканчивается.

Дерево поиска в ширину с начальной вершиной 1 для орграфа (рис.4.28), представлено на рис.4.32. Нижний индекс около номера вершины дерева определяет порядок посещения вершин.

11

22 43 54

35 76 67 88

99

Рис.4.32. Дерево поиска в ширину

При программной реализации метода поиска в ширину для запоминания порядка посещения вершин используется очередь, а множество V’ – для хранения вершин, достижимых из начальной. Дерево поиска в ширину можно сохранить в массиве T, в котором элемент Ti представляет собой вершину, предшествующую вершине i в дереве.

Алгоритм 4.11 (рис.4.33) поиска в ширину.

Вход: v –начальная вершина.

Выход: последовательность вершин орграфа в порядке их посещения в процессе поиска в глубину;

T – дерево поиска в ширину.

Поиск в ширину(v)

v

V’ :={v}

Tv := 0

поместить

v в очередь

v:=элемент из очереди

xГ(v)-V’

x

V’ :=V’{v}

Tx := v

поместить

x в очередь

очередь пуста

Конец

Рис.4.33. Алгоритм