Depth First Search eller DFS for en graf
Depth First Traversal (eller DFS) for en graf ligner på Dybde Første gjennomgang av et tre. Den eneste fangsten her er at, i motsetning til trær, kan grafer inneholde sykluser (en node kan besøkes to ganger). For å unngå å behandle en node mer enn én gang, bruk en boolsk besøkt matrise. En graf kan ha mer enn én DFS-gjennomgang.
Eksempel:
Anbefalt praksis DFS of Graph Prøv det!Inndata: n = 4, e = 6
0 -> 1, 0 -> 2, 1 -> 2, 2 -> 0, 2 -> 3, 3 -> 3
Produksjon: DFS fra toppunkt 1 : 1 2 0 3
Forklaring:
DFS-diagram:![]()
Eksempel 1
Inndata: n = 4, e = 6
2 -> 0, 0 -> 2, 1 -> 2, 0 -> 1, 3 -> 3, 1 -> 3
Produksjon: DFS fra toppunkt 2: 2 0 1 3
Forklaring:
DFS-diagram:![]()
Eksempel 2
Hvordan fungerer DFS?
Dybde-først-søk er en algoritme for å krysse eller søke i tre- eller grafdatastrukturer. Algoritmen starter ved rotnoden (velger en vilkårlig node som rotnoden i tilfelle av en graf) og utforsker så langt som mulig langs hver gren før den går tilbake.
La oss forstå hvordan Dybde første søk ved hjelp av følgende illustrasjon:
Trinn 1: Til å begynne med er stablet og besøkte matriser tomme.
Stabel og besøkte arrays er tomme i utgangspunktet.
Steg 2: Besøk 0 og legg tilstøtende noder som ikke er besøkt ennå i stabelen.
Besøk node 0 og legg tilstøtende noder (1, 2, 3) i stabelen
Trinn 3: Nå, node 1 på toppen av stabelen, så besøk node 1 og ta den ut av stabelen og legg alle tilstøtende noder som ikke er besøkt i stabelen.
Besøk node 1
Trinn 4: Nå, Node 2 på toppen av stabelen, så besøk node 2 og ta den ut av stabelen og legg alle tilstøtende noder som ikke er besøkt (dvs. 3, 4) i stabelen.
Besøk node 2 og legg dens ubesøkte tilstøtende noder (3, 4) i stabelen
Trinn 5: Nå, node 4 på toppen av stabelen, så besøk node 4 og ta den ut av stabelen og legg alle tilstøtende noder som ikke er besøkt i stabelen.
Besøk node 4
Trinn 6: Nå, node 3 på toppen av stabelen, så besøk node 3 og ta den ut av stabelen og legg alle tilstøtende noder som ikke er besøkt i stabelen.
Besøk node 3
Nå blir Stack tom, noe som betyr at vi har besøkt alle nodene og DFS-gjennomgangen vår.
Nedenfor er implementeringen av tilnærmingen ovenfor:
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> >besøkt;> > 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> >::iterator 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
// 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#
// 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> >[i ];> > for> (> int> i = 0; i adj[i] = new List |
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 |
Produksjon
Following is Depth First Traversal (starting from vertex 2) 2 0 1 3
Kompleksitetsanalyse av første dybdesøk:
- Tidskompleksitet: O(V + E), der V er antall hjørner og E er antall kanter i grafen.
- Hjelpeplass: O(V + E), siden det kreves en ekstra besøkt matrise med størrelse V, og stabelstørrelse for iterativt kall til DFS-funksjonen.