freeCodeCamp/guide/russian/algorithms/graph-algorithms/depth-first-search/index.md

5.2 KiB
Raw Blame History

title localeTitle
Depth First Search (DFS) Глубина первого поиска (DFS)

Глубина первого поиска (DFS)

Depth First Search - один из самых простых алгоритмов графа. Он пересекает график, сначала проверяя текущий узел, а затем переходя к одному из его помощников, чтобы повторить процесс. Если в текущем узле нет помощника для проверки, мы возвращаемся к его предшественнику, и процесс продолжается (перейдя к другому помощнику). Если решение найдено, поиск останавливается.

Визуализация

Реализация (C ++ 14)

`` `C ++

включают

включают

включают

включают

использование пространства имен std;

класс Graph { на телевидении; // количество вершин

// pointer to a vector containing adjacency lists 
 vector < int > *adj; 

общественности: График (int v); // Конструктор

// function to add an edge to graph 
 void add_edge(int v, int w); 
 
 // prints dfs traversal from a given source `s` 
 void dfs(); 
 void dfs_util(int s, vector < bool> &visited); 

};

Graph :: Graph (int v) { это -> v = v; adj = новый вектор [v]; }

void Graph :: add edge (int u, int v) { adj [u] .push назад (v); // добавьте v в список u adj [v] .push назад (v); // добавим u в список v (удалите этот оператор, если график направлен!) } void Graph :: dfs () { // посещаемый вектор - отслеживать посещаемые узлы во время DFS вектор посещен (v, false); // маркировка всех узлов / вершин как не посещенных for (int i = 0; i <v; i ++) если (! посещаемые [я]) dfs util (i, посещенный); } // обратите внимание на использование вызова по ссылке здесь! void Graph :: dfs_util (int s, vector & visited) { // пометить текущий узел / вершину как посещенный [s] = true; // выводим его на стандартный вывод (экран) cout << s << "";

// traverse its adjacency list and recursively call dfs_util for all of its neighbours! 
 // (only if the neighbour has not been visited yet!) 
 for(vector < int > :: iterator itr = adj[s].begin(); itr != adj[s].end(); itr++) 
    if(!visited[*itr]) 
        dfs_util(*itr, visited); 

}

int main () { // создаем граф, используя класс Graph, который мы определили выше График g (4); g.add edge (0, 1); g.add edge (0, 2); g.add edge (1, 2); g.add edge (2, 0); g.add edge (2, 3); g.add edge (3, 3);

cout << "Following is the Depth First Traversal of the provided graph" 
     << "(starting from vertex 0): "; 
 g.dfs(); 
 // output would be: 0 1 2 3 
 return 0; 

}

### Evaluation 
 
 Space Complexity: O(n) 
 
 Worse Case Time Complexity: O(n) 
 Depth First Search is complete on a finite set of nodes. I works better on shallow trees. 
 
 ### Implementation of DFS in C++ 

C ++

включают

включают

включают

использование пространства имен std;

struct Graph { на телевидении; bool * adj; общественности: График (int vcount); void addEdge (int u, int v); void deleteEdge (int u, int v); вектор DFS (int s); void DFSUtil (int s, vector & ДФС, вектор и посетил); }; Graph :: Graph (int vcount) { this-> v = vcount; this-> adj = new bool [vcount]; для (int i = 0; i

void Graph :: addEdge (int u, int w) { this-> прил [и] [ш] = TRUE; this-> прил [ш] [и] = TRUE; }

void Graph :: deleteEdge (int u, int w) { this-> прил [и] [ш] = ложь; this-> прил [ж] [и] = ложь; }

void Graph :: DFSUtil (int s, vector & dfs, вектор И посетил) { посетил [с] = TRUE; dfs.push_back (ы); для (int i = 0; i v; я ++) { if (this-> adj [s] [i] == true && visited [i] == false) Dfsutil (я, ДФС, посетил); } }

вектор Graph :: DFS (int s) { вектор посетил (this-> v); вектор ДФС; Dfsutil (s, ДФС, посетили); return dfs; } `` `

Дополнительная информация:

диаграммы

Первый поиск Breadth (BFS)

Глубина первого поиска (DFS) - Википедия