Depth First Search or DFS for a Graph

Depth First Traversal (or Search) for a graph is similar to Depth First Traversal of a tree. The only catch here is, unlike trees, graphs may contain cycles, a node may be visited twice. To avoid processing a node more than once, use a boolean visited array.

Example:

Input: n = 4, e = 6
0 -> 1, 0 -> 2, 1 -> 2, 2 -> 0, 2 -> 3, 3 -> 3
Output: DFS from vertex 1 : 1 2 0 3
Explanation:
DFS Diagram:

Input: n = 4, e = 6
2 -> 0, 0 -> 2, 1 -> 2, 0 -> 1, 3 -> 3, 1 -> 3
Output: DFS from vertex 2 : 2 0 1 3
Explanation:
DFS Diagram:



Prerequisites: See this post for all applications of Depth First Traversal.



Following are implementations of simple Depth First Traversal. The C++ implementation uses adjacency list representation of graphs. STL‘s list container is used to store lists of adjacent nodes.

Solution:

  • Approach: Depth-first search is an algorithm for traversing or searching tree or graph data structures. The algorithm starts at the root node (selecting some arbitrary node as the root node in the case of a graph) and explores as far as possible along each branch before backtracking. So the basic idea is to start from the root or any arbitrary node and mark the node and move to the adjacent unmarked node and continue this loop until there is no unmarked adjacent node. Then backtrack and check for other unmarked nodes and traverse them. Finally print the nodes in the path.
  • Algorithm:
    1. Create a recursive function that takes the index of node and a visited array.
    2. Mark the current node as visited and print the node.
    3. Traverse all the adjacent and unmarked nodes and call the recursive function with index of adjacent node.
  • Implementation:

    C++

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // C++ program to print DFS traversal from
    // a given vertex in a  given graph
    #include<bits/stdc++.h>
    using namespace std;
      
    // Graph class represents a directed graph
    // using adjacency list representation
    class Graph
    {
        int V;    // No. of vertices
      
        // Pointer to an array containing
        // adjacency lists
        list<int> *adj;
      
        // A recursive function used by DFS
        void DFSUtil(int v, bool visited[]);
    public:
        Graph(int V);   // Constructor
      
        // 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);
    };
      
    Graph::Graph(int V)
    {
        this->V = V;
        adj = new list<int>[V];
    }
      
    void Graph::addEdge(int v, int w)
    {
        adj[v].push_back(w); // Add w to v’s list.
    }
      
    void Graph::DFSUtil(int v, bool visited[])
    {
        // 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])
                DFSUtil(*i, visited);
    }
      
    // DFS traversal of the vertices reachable from v.
    // It uses recursive DFSUtil()
    void Graph::DFS(int v)
    {
        // Mark all the vertices as not visited
        bool *visited = new bool[V];
        for (int i = 0; i < V; i++)
            visited[i] = false;
      
        // Call the recursive helper function
        // to print DFS traversal
        DFSUtil(v, visited);
    }
      
    // Driver code
    int main()
    {
        // Create a graph given in the above diagram
        Graph g(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);
      
        cout << "Following is Depth First Traversal"
                " (starting from vertex 2) \n";
        g.DFS(2);
      
        return 0;
    }

    chevron_right

    
    

    Java

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // Java program to print DFS traversal from a given given graph
    import java.io.*;
    import java.util.*;
      
    // This class represents a directed graph using adjacency list
    // representation
    class Graph
    {
        private int V;   // No. of vertices
      
        // Array  of lists for Adjacency List Representation
        private LinkedList<Integer> adj[];
      
        // Constructor
        Graph(int v)
        {
            V = v;
            adj = new LinkedList[v];
            for (int i=0; i<v; ++i)
                adj[i] = new LinkedList();
        }
      
        //Function to add an edge into the graph
        void addEdge(int v, int w)
        {
            adj[v].add(w);  // Add w to v's list.
        }
      
        // 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<Integer> 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);
        }
      
        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)");
      
            g.DFS(2);
        }
    }
    // This code is contributed by Aakash Hasija

    chevron_right

    
    

    Python3

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    # Python3 program to print DFS traversal 
    # from a given 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[v] = True
            print(v, end = ' ')
      
            # Recur for all the vertices 
            # adjacent to this vertex
            for i in self.graph[v]:
                if visited[i] == False:
                    self.DFSUtil(i, visited)
      
        # The function to do DFS traversal. It uses
        # recursive DFSUtil()
        def DFS(self, v):
      
            # Mark all the vertices as not visited
            visited = [False] * (max(self.graph)+1)
      
            # Call the recursive helper function 
            # to print DFS traversal
            self.DFSUtil(v, visited)
      
    # Driver code
      
    # Create a graph given 
    # in the above diagram
    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 DFS from (starting from vertex 2)")
    g.DFS(2)
      
    # This code is contributed by Neelam Yadav

    chevron_right

    
    

    C#

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // 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; // No. of vertices 
      
        // Array of lists for 
        // Adjacency List Representation 
        private List<int>[] adj;
      
        // Constructor 
        Graph(int v)
        {
            V = v;
            adj = new List<int>[v];
            for (int i = 0; i < v; ++i)
                adj[i] = new List<int>();
        }
      
        //Function to Add an edge into the graph 
        void AddEdge(int v, int w)
        {
            adj[v].Add(w); // Add w to v's list. 
        }
      
        // A function used by DFS 
        void DFSUtil(int v, bool[] visited)
        {
            // Mark the current node as visited
            // and print it 
            visited[v] = true;
            Console.Write(v + " ");
      
            // Recur for all the vertices 
            // adjacent to this vertex 
            List<int> vList = adj[v];
            foreach (var n in vList)
            {
                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 c#) 
            bool[] visited = new bool[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);
      
            Console.WriteLine("Following is Depth First Traversal " +
                              "(starting from vertex 2)");
      
            g.DFS(2);
            Console.ReadKey();
        }
    }
      
    // This code is contributed by techno2mahi 

    chevron_right

    
    


    Output:

    Following is Depth First Traversal (starting from vertex 2)
    2 0 1 3
    
  • Complexity Analysis:

    • Time complexity: O(V + E), where V is the number of vertices and E is the number of edges in the graph.
    • Space Complexity: O(V).
      Since, an extra visited array is needed of size V.


Handling Disconnected Graph

  • Solution: This will happen by handling a corner case.
    The above code traverses only the vertices reachable from a given source vertex. All the vertices may not be reachable from a given vertex as in the case of a Disconnected graph. To do complete DFS traversal of such graphs, run DFS from all unvisited nodes after a DFS.
    The recursive function remains the same.
  • Algorithm:
    1. Create a recursive function that takes the index of node and a visited array.
    2. Mark the current node as visited and print the node.
    3. Traverse all the adjacent and unmarked nodes and call the recursive function with index of adjacent node.
    4. Run a loop from 0 to number of vertices and check if the node is unvisited in previous DFS then call the recursive function with current node.
  • Implementation:

    C++

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // C++ program to print DFS traversal for a given given graph
    #include<bits/stdc++.h>
    using namespace std;
      
    class Graph
    {
        int V;    // No. of vertices
        list<int> *adj;    // Pointer to an array containing adjacency lists
        void DFSUtil(int v, bool visited[]);  // A function used by DFS
    public:
        Graph(int V);   // Constructor
        void addEdge(int v, int w);   // function to add an edge to graph
        void DFS();    // prints DFS traversal of the complete graph
    };
      
    Graph::Graph(int V)
    {
        this->V = V;
        adj = new list<int>[V];
    }
      
    void Graph::addEdge(int v, int w)
    {
        adj[v].push_back(w); // Add w to v’s list.
    }
      
    void Graph::DFSUtil(int v, bool visited[])
    {
        // 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])
                DFSUtil(*i, visited);
    }
      
    // The function to do DFS traversal. It uses recursive DFSUtil()
    void Graph::DFS()
    {
        // Mark all the vertices as not visited
        bool *visited = new bool[V];
        for (int i = 0; i < V; i++)
            visited[i] = false;
      
        // Call the recursive helper function to print DFS traversal
        // starting from all vertices one by one
        for (int i = 0; i < V; i++)
            if (visited[i] == false)
                DFSUtil(i, visited);
    }
      
    int main()
    {
        // Create a graph given in the above diagram
        Graph g(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);
      
        cout << "Following is Depth First Traversaln";
        g.DFS();
      
        return 0;
    }

    chevron_right

    
    

    Java

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // Java program to print DFS traversal from a given given graph
    import java.io.*;
    import java.util.*;
      
    // This class represents a directed graph using adjacency list
    // representation
    class Graph
    {
        private int V;   // No. of vertices
      
        // Array  of lists for Adjacency List Representation
        private LinkedList<Integer> adj[];
      
        // Constructor
        Graph(int v)
        {
            V = v;
            adj = new LinkedList[v];
            for (int i=0; i<v; ++i)
                adj[i] = new LinkedList();
        }
      
        //Function to add an edge into the graph
        void addEdge(int v, int w)
        {
            adj[v].add(w);    // Add w to v's list.
        }
      
        // 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<Integer> 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()
        {
            // 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
            // starting from all vertices one by one
            for (int i=0; i<V; ++i)
                if (visited[i] == false)
                    DFSUtil(i, visited);
        }
      
        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");
      
            g.DFS();
        }
    }
    // This code is contributed by Aakash Hasija

    chevron_right

    
    

    Python

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    # Python program to print DFS traversal for complete 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[v]= True
            print v,
      
            # Recur for all the vertices adjacent to
            # this vertex
            for i in self.graph[v]:
                if visited[i] == False:
                    self.DFSUtil(i, visited)
      
      
        # The function to do DFS traversal. It uses
        # recursive DFSUtil()
        def DFS(self):
            V = len(self.graph)  #total vertices
      
            # Mark all the vertices as not visited
            visited =[False]*(V)
      
            # Call the recursive helper function to print
            # DFS traversal starting from all vertices one
            # by one
            for i in range(V):
                if visited[i] == False:
                    self.DFSUtil(i, visited)
      
      
    # Driver code
    # Create a graph given in the above diagram
    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"
    g.DFS()
      
    # This code is contributed by Neelam Yadav

    chevron_right

    
    

    C#

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // C# program to print DFS traversal from a given given graph 
    using System;
    using System.Collections.Generic;
      
    // This class represents a directed graph using adjacency list 
    // representation 
    public class Graph 
        private int V; // No. of vertices 
      
        // Array of lists for Adjacency List Representation 
        private List<int> []adj; 
      
        // Constructor 
        Graph(int v) 
        
            V = v; 
            adj = new List<int>[v]; 
            for (int i = 0; i < v; ++i) 
                adj[i] = new List<int>(); 
        
      
        //Function to add an edge into the graph 
        void addEdge(int v, int w) 
        
            adj[v].Add(w); // Add w to v's list. 
        
      
        // A function used by DFS 
        void DFSUtil(int v, bool []visited) 
        
            // Mark the current node as visited and print it 
            visited[v] = true
            Console.Write(v + " "); 
      
            // Recur for all the vertices adjacent to this vertex 
            foreach(int i in adj[v])
            
                int n = i; 
                if (!visited[n]) 
                    DFSUtil(n, visited); 
            
        
      
        // The function to do DFS traversal. It uses recursive DFSUtil() 
        void DFS() 
        
            // Mark all the vertices as not visited(set as 
            // false by default in java) 
            bool []visited = new bool[V]; 
      
            // Call the recursive helper function to print DFS traversal 
            // starting from all vertices one by one 
            for (int i = 0; i < V; ++i) 
                if (visited[i] == false
                    DFSUtil(i, 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); 
      
            Console.WriteLine("Following is Depth First Traversal"); 
      
            g.DFS(); 
        
      
    // This code is contributed by PrinciRaj1992

    chevron_right

    
    


    Output:

    Following is Depth First Traversal
    0 1 2 3
  • Complexity Analysis:

    • Time complexity: O(V + E), where V is the number of vertices and E is the number of edges in the graph.
    • Space Complexity :O(V).
      Since an extra visited array is needed of size V.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




My Personal Notes arrow_drop_up

Article Tags :
Practice Tags :


104


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.