Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Графы.doc
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
366 Кб
Скачать

Алгоритмы над графами

Обход графа в глубину

Пусть задан граф G = (V,E), где V — множество вершин графа, E — множество ребер графа. Предположим, что в начальный момент времени все вершины графа окрашены в белый цвет. Выполним следующие действия:

  1. Из множества всех белых вершин выберем любую вершину, обозначим её v1.

  2. Выполняем для неё процедуру DFS(v1).

  3. Перекрашиваем её в чёрный цвет.

  4. Повторяем шаги 1-3 до тех пор, пока множество белых вершин не пусто.

Процедура DFS (параметр — вершина )

  1. Перекрашиваем вершину u в серый цвет.

  2. Для всякой вершины w, смежной с вершиной u, выполняем следующие два шага:

    1. Если вершина w окрашена в белый цвет, выполняем процедуру DFS(w).

    2. Окрашиваем w в чёрный цвет.

Обход графа в ширину

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

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

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

Алгоритм обхода приведён ниже:

создадим пустую очередь открытых вершин;

пометим все вершины как "новые";

вершина Start помещается в очередь и помечается как открытая;

while(очередь не пуста) {

v=вершина в начале очереди;

для всех вершин, смежных с v {

v1=очередная вершина, смежная с v;

If(вершина v1 "новая"){

поместим её в очередь и пометим как открытую;

запомним ребро (v,v1) в массиве пройденных ребер

} // конец прохода вершин смежных с v

вершина v становится закрытой и удаляется из очереди;

занесем вершину v в массив посещенных вершин;

} // конец цикла "пока очередь не пуста"

Если компонента связности единственная в графе, то пройденные ребра образуют остовное дерево.

Если граф состоит из более чем одной компоненты связности, то следует повторить процесс для каждой стартовой вершины, оставшейся “новой” после предыдущего прохода алгоритма. В результате будет получен остовный лес.