logo

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:

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

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

Eksempel 2

Anbefalt praksis DFS of Graph Prøv det!

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.

tekstomslag css

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++

sett java




// 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

all caps kommandoen excel




// 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>

>

>

java konverter streng til heltall

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 (); } // Funksjon for å legge til en kant i grafens tomrom AddEdge(int v, int w) { // Legg til w til vs liste. adj[v].Add(w); } // En funksjon brukt av DFS void DFSUtil(int v, bool[] besøkt) { // Merk gjeldende node som besøkt // og skriv ut den besøkt[v] = true; Console.Write(v + ' '); // Gjenta for alle toppunktene // ved siden av denne toppunktlisten vList = adj[v]; foreach(var n i vList) { if (!besøkt[n]) DFSUtil(n, besøkt); } } // Funksjonen for å gjøre DFS-traversering. // Den bruker rekursiv DFSUtil() void DFS(int v) { // Merk alle toppunktene som ikke besøkt // (sett som usann som standard i c#) bool[] besøkt = new bool[V]; // Kall den rekursive hjelpefunksjonen // for å skrive ut DFS-traversal DFSUtil(v, besøkt); } // 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); Console.WriteLine( 'Følger er Depth First Traversal ' + '(starter fra toppunkt 2)'); // Funksjonskall g.DFS(2); Console.ReadKey(); } } // Denne koden er bidratt av techno2mahi>

>

>

industri og fabrikk

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.