logo

Recherche en profondeur d'abord ou DFS pour un graphique

Profondeur d'abord traversée (ou DFS) car un graphique est similaire à Profondeur Première Traversée d'un arbre. Le seul problème ici est que, contrairement aux arbres, les graphiques peuvent contenir des cycles (un nœud peut être visité deux fois). Pour éviter de traiter un nœud plus d'une fois, utilisez un tableau booléen visité. Un graphique peut avoir plusieurs parcours DFS.

Exemple:

Saisir: n = 4, e = 6
0 -> 1, 0 -> 2, 1 -> 2, 2 -> 0, 2 -> 3, 3 -> 3
Sortir: DFS du sommet 1 : 1 2 0 3
Explication:
Diagramme DFS :



Exemple 1

Exemple 1

Saisir: n = 4, e = 6
2 -> 0, 0 -> 2, 1 -> 2, 0 -> 1, 3 -> 3, 1 -> 3
Sortir: DFS du sommet 2 : 2 0 1 3
Explication:
Diagramme DFS :

Exemple 2

Exemple 2

Pratique recommandée DFS de Graph Essayez-le !

Comment fonctionne le DFS ?

La recherche en profondeur est un algorithme permettant de parcourir ou de rechercher des structures de données arborescentes ou graphiques. L'algorithme commence au nœud racine (en sélectionnant un nœud arbitraire comme nœud racine dans le cas d'un graphique) et explore autant que possible le long de chaque branche avant de revenir en arrière.

Comprenons le fonctionnement de Recherche en profondeur d'abord à l'aide de l'illustration suivante :

Étape 1: Initialement, la pile et les tableaux visités sont vides.

carcajou contre blaireau

La pile et les tableaux visités sont initialement vides.

Étape 2: Visitez 0 et placez ses nœuds adjacents qui ne sont pas encore visités dans la pile.

Visitez le nœud 0 et placez ses nœuds adjacents (1, 2, 3) dans la pile

Étape 3: Maintenant, le nœud 1 en haut de la pile, alors visitez le nœud 1 et sortez-le de la pile et placez tous ses nœuds adjacents qui ne sont pas visités dans la pile.

Visitez le nœud 1

Étape 4: Maintenant, Nœud 2 en haut de la pile, visitez donc le nœud 2, sortez-le de la pile et placez tous ses nœuds adjacents qui ne sont pas visités (c'est-à-dire 3, 4) dans la pile.

Visitez le nœud 2 et placez ses nœuds adjacents non visités (3, 4) dans la pile

Étape 5 : Maintenant, le nœud 4 en haut de la pile, alors visitez le nœud 4 et sortez-le de la pile et placez tous ses nœuds adjacents qui ne sont pas visités dans la pile.

Visitez le nœud 4

Étape 6 : Maintenant, le nœud 3 en haut de la pile, alors visitez le nœud 3 et sortez-le de la pile et placez tous ses nœuds adjacents qui ne sont pas visités dans la pile.

Visitez le nœud 3

Maintenant, Stack devient vide, ce qui signifie que nous avons visité tous les nœuds et que notre parcours DFS se termine.

python à chaîne f

Vous trouverez ci-dessous la mise en œuvre de l’approche ci-dessus :

C++




// C++ program to print DFS traversal from> // a given vertex in a given graph> #include> using> namespace> std;> // Graph class represents a directed graph> // using adjacency list representation> class> Graph {> public>:> >map<>int>,>bool>>visité;> >map<>int>, list<>int>>> adj;> >// Function to add an edge to graph> >void> addEdge(>int> v,>int> w);> >// DFS traversal of the vertices> >// reachable from v> >void> DFS(>int> v);> };> void> Graph::addEdge(>int> v,>int> w)> {> >// Add w to v’s list.> >adj[v].push_back(w);> }> void> Graph::DFS(>int> v)> {> >// Mark the current node as visited and> >// print it> >visited[v] =>true>;> >cout << v <<>' '>;> >// Recur for all the vertices adjacent> >// to this vertex> >list<>int>>::itérateur i;> >for> (i = adj[v].begin(); i != adj[v].end(); ++i)> >if> (!visited[*i])> >DFS(*i);> }> // Driver code> int> main()> {> >// Create a graph given in the above diagram> >Graph g;> >g.addEdge(0, 1);> >g.addEdge(0, 2);> >g.addEdge(1, 2);> >g.addEdge(2, 0);> >g.addEdge(2, 3);> >g.addEdge(3, 3);> >cout <<>'Following is Depth First Traversal'> >' (starting from vertex 2) '>;> >// Function call> >g.DFS(2);> >return> 0;> }> // improved by Vishnudev C>

>

>

Java




bin en bcd
// Java program to print DFS traversal> // from a given graph> import> java.io.*;> import> java.util.*;> // This class represents a> // directed graph using adjacency> // list representation> class> Graph {> >private> int> V;> >// Array of lists for> >// Adjacency List Representation> >private> LinkedList adj[];> >// Constructor> >@SuppressWarnings>(>'unchecked'>) Graph(>int> v)> >{> >V = v;> >adj =>new> LinkedList[v];> >for> (>int> i =>0>; i adj[i] = new LinkedList(); } // Function to add an edge into the graph void addEdge(int v, int w) { // Add w to v's list. adj[v].add(w); } // A function used by DFS void DFSUtil(int v, boolean visited[]) { // Mark the current node as visited and print it visited[v] = true; System.out.print(v + ' '); // Recur for all the vertices adjacent to this // vertex Iterator i = adj[v].listIterator(); while (i.hasNext()) { int n = i.next(); if (!visited[n]) DFSUtil(n, visited); } } // The function to do DFS traversal. // It uses recursive DFSUtil() void DFS(int v) { // Mark all the vertices as // not visited(set as // false by default in java) boolean visited[] = new boolean[V]; // Call the recursive helper // function to print DFS // traversal DFSUtil(v, visited); } // Driver Code public static void main(String args[]) { Graph g = new Graph(4); g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 2); g.addEdge(2, 0); g.addEdge(2, 3); g.addEdge(3, 3); System.out.println( 'Following is Depth First Traversal ' + '(starting from vertex 2)'); // Function call g.DFS(2); } } // This code is contributed by Aakash Hasija>

>

>

Python3




# Python3 program to print DFS traversal> # from a given graph> from> collections>import> defaultdict> # This class represents a directed graph using> # adjacency list representation> class> Graph:> ># Constructor> >def> __init__(>self>):> ># Default dictionary to store graph> >self>.graph>=> defaultdict(>list>)> > ># Function to add an edge to graph> >def> addEdge(>self>, u, v):> >self>.graph[u].append(v)> > ># A function used by DFS> >def> DFSUtil(>self>, v, visited):> ># Mark the current node as visited> ># and print it> >visited.add(v)> >print>(v, end>=>' '>)> ># Recur for all the vertices> ># adjacent to this vertex> >for> neighbour>in> self>.graph[v]:> >if> neighbour>not> in> visited:> >self>.DFSUtil(neighbour, visited)> > ># The function to do DFS traversal. It uses> ># recursive DFSUtil()> >def> DFS(>self>, v):> ># Create a set to store visited vertices> >visited>=> set>()> ># Call the recursive helper function> ># to print DFS traversal> >self>.DFSUtil(v, visited)> # Driver's code> if> __name__>=>=> '__main__'>:> >g>=> Graph()> >g.addEdge(>0>,>1>)> >g.addEdge(>0>,>2>)> >g.addEdge(>1>,>2>)> >g.addEdge(>2>,>0>)> >g.addEdge(>2>,>3>)> >g.addEdge(>3>,>3>)> >print>(>'Following is Depth First Traversal (starting from vertex 2)'>)> > ># Function call> >g.DFS(>2>)> # This code is contributed by Neelam Yadav>

>

>

C#




mvc pour java

// C# program to print DFS traversal> // from a given graph> using> System;> using> System.Collections.Generic;> // This class represents a directed graph> // using adjacency list representation> class> Graph {> >private> int> V;> >// Array of lists for> >// Adjacency List Representation> >private> List<>int>>[] adj;> >// Constructor> >Graph(>int> v)> >{> >V = v;> >adj =>new> List<>int>>[ dans ];> >for> (>int> i = 0; i adj[i] = new List (); } // Fonction pour ajouter une arête dans le graphique void AddEdge(int v, int w) { // Ajouter w à la liste de v. adj[v].Add(w); } // Une fonction utilisée par DFS void DFSUtil(int v, bool[] approved) { // Marque le nœud actuel comme visité // et l'imprime visited[v] = true; Console.Write(v + ' '); // Récurrence pour tous les sommets // adjacents à cette liste de sommets vListe = adj[v]; foreach(var n in vList) { if (!visited[n]) DFSUtil(n, visité); } } // La fonction pour effectuer le parcours DFS. // Il utilise DFSUtil() récursif void DFS(int v) { // Marque tous les sommets comme non visités // (défini comme false par défaut en c#) bool[] visité = new bool[V]; // Appelez la fonction d'assistance récursive // ​​pour imprimer le parcours DFS DFSUtil(v, visité); } // Code du pilote public static void Main(String[] args) { Graph g = new Graph(4); g.AddEdge(0, 1); g.AddEdge(0, 2); g.AddEdge(1, 2); g.AddEdge(2, 0); g.AddEdge(2, 3); g.AddEdge(3, 3); Console.WriteLine( 'Voici la première traversée en profondeur ' + '(à partir du sommet 2)'); // Appel de fonction g.DFS(2); Console.ReadKey(); } } // Ce code est contribué par techno2mahi>

>

>

vlc télécharger des vidéos depuis youtube

Javascript




// Javascript program to print DFS> // traversal from a given> // graph> // This class represents a> // directed graph using adjacency> // list representation> class Graph> {> > >// Constructor> >constructor(v)> >{> >this>.V = v;> >this>.adj =>new> Array(v);> >for>(let i = 0; i this.adj[i] = []; } // Function to add an edge into the graph addEdge(v, w) { // Add w to v's list. this.adj[v].push(w); } // A function used by DFS DFSUtil(v, visited) { // Mark the current node as visited and print it visited[v] = true; console.log(v + ' '); // Recur for all the vertices adjacent to this // vertex for(let i of this.adj[v].values()) { let n = i if (!visited[n]) this.DFSUtil(n, visited); } } // The function to do DFS traversal. // It uses recursive // DFSUtil() DFS(v) { // Mark all the vertices as // not visited(set as // false by default in java) let visited = new Array(this.V); for(let i = 0; i

>

>

Sortir

Following is Depth First Traversal (starting from vertex 2) 2 0 1 3>

Analyse de la complexité de la recherche en profondeur :

  • Complexité temporelle : O(V + E), où V est le nombre de sommets et E est le nombre d'arêtes du graphe.
  • Espace auxiliaire : O(V + E), puisqu'un tableau visité supplémentaire de taille V est requis, et la taille de la pile pour l'appel itératif à la fonction DFS.