Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритмы на графах.doc
Скачиваний:
125
Добавлен:
13.04.2015
Размер:
621.06 Кб
Скачать

5.2. Поиск на графах

На практике часто возникают задачи, связанные с прохождением по вершинам графа. Например, необходимо ответить на вопрос: достижимали вершинаdиз вершиныa? То есть, существует ли путь изавd. Если исходный граф неориентированный, то для ответа на данный вопрос достаточно определить, принадлежат ли вершиныаиd одной связной компоненте. Выделить связные компоненты можно с помощью алгоритма Краскала. Если после завершения работы алгоритма Краскала вершиныаиdпринадлежат разным деревьям покрывающего леса (разным букетам – в терминах, используемых при формулировке алгоритма Краскала в разд. 5.1), то пути из вершиныав вершинуdне существует, в противном случае - путь существует.

Для ориентированного графа такой алгоритм не пригоден. Для ответа на вопрос, достижима вершина dиз вершиныaили нет, необходимо организовать обход вершин графа, начиная из вершиныа. Если во время обхода мы встретим вершинуd, следовательно, верщинаdдостижима из вершиныа, в противном случае -dизане достижима.

Существует два способа организации обхода: поиск в глубину и поиск в ширину.

Поиск в глубину

Поиск в глубину на графе G=(V,E) осуществляется по следующим правилам:

1. Начинаем поиск с произвольной вершины r. В качестве текущей вершиныvберем вершинуr.

2. Из текущей вершины vдвигаемся в любую, ранее не пройденную вершинуw, если такая вершина найдется (если вершиныwнет, см. пункт 3). Запоминаем дугу, по которой мы попали в вершинуw. В качестве текущей вершиныvберем вершинуw.

3. Если из вершины vмы не можем попасть в ранее не пройденную вершинуw, то возвращаемся в вершинуx, из которой мы попали вv. В качестве текущей вершиныvберем вершинуx.

4. Процесс поиска (пункты 2, 3) заканчивается, когда мы пытаемся вернуться назад из вершины, с которой начался поиск (вершина r).

Поиск в глубину проиллюстрирован на рис. 5.4.

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

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

1. Начинаем поиск с произвольной вершины r. Формируем множество текущих вершинA, включив в него вершинуr.

2. Идем в ранее не пройденные вершины по всем дугам с начальной вершиной из множества A. Запоминаем эти дуги. Формируем множествоA, включив в него конечные вершины пройденных дуг.

3. Процесс поиска (пункт 2) заканчивается, когда множество Aстанет пустым.

Поиск в ширину проиллюстрирован на рис. 5.5.

Упражнения:

1. Реализуйте алгоритм поиска в глубину и ширину. Оцените трудоемкость программ.

Указания:

Для хранения последовательности вершин обхода при использовании техники поиска в глубину следует использовать стек, а поиска в ширину – очередь.

Дуги, по которым осуществляется обход вершин графа, при использовании любой техники поиска образуют ориентированное дерево с корнем в начальной вершине. Это следует из того, что начальная вершина единственная и движение в ходе поиска не осуществляется в ранее пройденные вершины. Для хранения такого дерева целесообразно использовать массив Pдлиныn, гдеn– число вершин графа. Если вершины графа пронумерованы числами 1,2,…,n, то элементы массиваPопределяются следующим образом:Pi=0, еслиi– начальная вершина (корень дерева); в противном случаеPi=k, гдеk– вершина, предшествующая вершинеiна пути из корня в вершинуi.

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