Загрузка...

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

Тема в разделе C/C++ создана пользователем tgf1090 4 июл 2022. 181 просмотр

  1. tgf1090
    tgf1090 Автор темы 4 июл 2022 6 12 июл 2021
    Алгоритм поиска в глубину (dfs — depth-first-search) является одним из основных алгоритмов на графах и применяется как составная часть во многих других алгоритмах.

    Пример
    Пусть у нас есть неориентированный граф на n вершин, заданный нам в каком-либо виде (матрица смежности, список смежности или список рёбер). Также пусть нам дан номер вершины и нас просят найти компоненту связности, к которой эта вершина принадлежит.

    Алгоритм
    1. Встанем в текущую вершину графа
    2. Отметим текущую вершину как посещённую
    3. Посмотрим, с какими вершинами наша текущая вершина связана и возьмём из них первую, которая ещё не посещена
      • Если такая вершина нашлась, то пойдём в неё (шаг 1)
      • Если такой вершины не нашлось, то вернемся в вершину, из которой пришли в текущую
    Ссылка на гифку с визуализацией DFS

    Реализация через рекурсивную функцию
    C
    const int maxn = 1e5;

    bool used[maxn];
    vector<int> g[maxn];

    // что-то ещё
    // ***

    void dfs(int v){
    used[v] = true;
    // способ пройтись по вектору/массиву по элементам
    // переменная to будет принимать поочередно все значения вектора/массив от нулевого до последнего
    // в данном случае g[v] - это целый вектор
    for(int to : g[v]){
    if(used[to])
    continue;
    dfs(to);
    }
    }
    Временная сложность алгоритма
    Алгоритм работает за: О(N + M), где N и M - это количество вершин и ребер в графе, соответственно.
     
  2. vtlstolyarov
    vtlstolyarov 4 июл 2022 468 8 янв 2022
    Ну раз уж заговорил про обход графов, то надо бы еще упомянуть что есть нерекурсивные алголитмы для обхода оных, а то обходишь граф с глубиной больше тысячи и тут вдруг раз - stack overflow.
     
    1. tgf1090 Автор темы
      vtlstolyarov, Все верно, однако, размер стека рекурсии легко можно увеличить. Например, на Python это можно сделать так.
    2. tgf1090 Автор темы
      vtlstolyarov, Для C++ можно увеличить стек рекурсии опциями компиляции, а можно и в коде:
      #pragma comment(linker, "/stack:200000000")
    3. vtlstolyarov
      tgf1090, можно, но зачем? если можно применить алгоритм без рекурсивных вызовов.
Top
Загрузка...