Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Структуры данных.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.58 Mб
Скачать

Алгоритм поиска в глубину[править | править вики-текст]

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

  1. Пройдём по всем вершинам  .

    • Если вершина   белая, выполним для неё DFS(v).

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

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

  2. Для всякой вершины смежной с вершиной   и окрашенной в белый цвет, рекурсивно выполняем процедуру DFS(w)[2].

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

Часто используют двухцветные метки — без серого, на 1-м шаге красят сразу в чёрный цвет.

Нерекурсивные варианты[править | править вики-текст]

На больших графах поиск в глубину серьёзно нагружает стек вызовов. Если есть риск переполнения стека, используют нерекурсивные варианты поиска.

Первый вариант: можно сэмулировать стек вызова программно: для каждой из серых вершин в стеке будет храниться её номер   и номер текущей смежной вершины  .

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

  1. Кладём на стек пару  . Перекрашиваем вершину   в серый цвет.

  2. Пока стек не пуст…

    1. Берём верхнюю пару  , не извлекая её из стека.

    2. Находим вершину  , смежную с   и следующую за  .

      1. Если таковой нет, извлекаем   из стека, перекрашиваем вершину   в чёрный цвет.

      2. В противном случае присваиваем  , прямо в стеке.

        • Если к тому же вершина   белая, кладём на стек пару  , перекрашиваем   в серый цвет.

Второй вариант: можно в каждой из «серых» вершин держать текущее   и указатель на предыдущую (ту, из которой пришли).

Третий вариант работает, если хватает двухцветных меток.

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

  1. Кладём на стек вершину  .

  2. Пока стек не пуст…

    1. Берём верхнюю вершину  .

    2. Если она белая…

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

      2. Кладём в стек все смежные с   белые вершины.

Общая идея

Общая идея алгоритма состоит в следующем: для каждой не пройденной вершины необходимо найти все не пройденные смежные вершины и повторить поиск для них.

[Править]Пошаговое представление

  1. Выбираем любую вершину из еще не пройденных, обозначим ее как  .

  2. Запускаем процедуру 

    • Помечаем вершину   как пройденную

    • Для каждой не пройденной смежной с   вершиной (назовем ее  ) запускаем 

  3. Повторяем шаги 1 и 2, пока все вершины не окажутся пройденными.

[Править]Реализация

vector<bool> visited; //вектор для хранения информации о пройденных и не пройденных вершинах

void dfs(int u)

{

visited[u] = true; //помечаем вершину как пройденную

for (v таких, что (u, v) — ребро в G) //проходим по смежным с u вершинам

if (!visited[v]) //проверяем, не находились ли мы ранее в выбранной вершине

dfs(v);

}

int main()

{

... //задание графа G с количеством вершин n.

visited.assign(n, false); //в начале все вершины в графе не пройденные

for (int i = 0; i < n; ++i) //проходим по всем вершинам графа...

if (!visited[i]) //...не забыв проверить, были мы уже в очередной вершине или нет

dfs(i);

return 0;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]