Given an undirected graph G(V, E) with N vertices and M edges. We need to find the minimum number of edges between a given pair of vertices (u, v). 
We have already discussed this problem using the BFS approach, here we will use the DFS approach.
Examples:
Input: For the following given graph, find the minimum number of edges between vertex pair (0, 4)
Output:1
There are three paths from 0 to 4:
0 -> 1 -> 2 -> 4
0 -> 1 -> 2 -> 3 -> 4
0 -> 4
Only the third path results in minimum number of edges.
Approach: In this approach we will traverse the graph in a DFS manner, starting from the given vertex and explore all the paths from that vertex to our destination vertex.
We will use two variables, edge_count and min_num_of_edges. While exploring all the paths, between these vertices, edge_count will store count of total number of edges among them, if number of edges is less than the minimum number of edges we will update min_num_of_edges.
Below is the implementation of the above approach:
C++
// C++ program to find minimum// number of edges between any two// vertices of the graph#include <bits/stdc++.h>using namespace std;// Class to represent a graphclass Graph {    // No. of vertices    int V;    // Pointer to an array containing    // adjacency lists    list<int>* adj;    // A function used by minEdgeDFS    void minEdgeDFSUtil(vector<bool>& visited,                        int src, int des, int& min_num_of_edges,                        int& edge_count);public:    // Constructor    Graph(int V);    // Function to add an edge to graph    void addEdge(int src, int des);    // Prints the minimum number of edges    void minEdgeDFS(int u, int v);};Graph::Graph(int V){    this->V = V;    adj = new list<int>[V];}void Graph::addEdge(int src, int des){    adj[src].push_back(des);    adj[des].push_back(src);}// Utility function for finding minimum number// of edges using DFSvoid Graph::minEdgeDFSUtil(vector<bool>& visited,                           int src, int des, int& min_num_of_edges,                           int& edge_count){    // For keeping track of visited    // nodes in DFS    visited[src] = true;    // If we have found the destination vertex    // then check whether count of total number of edges    // is less than the minimum number of edges or not    if (src == des) {        if (min_num_of_edges > edge_count)            min_num_of_edges = edge_count;    }    // If current vertex is not destination    else {        // Recur for all the vertices        // adjacent to current vertex        list<int>::iterator i;        for (i = adj[src].begin(); i != adj[src].end(); i++) {            int v = *i;            if (!visited[v]) {                edge_count++;                minEdgeDFSUtil(visited, v, des, min_num_of_edges,                               edge_count);            }        }    }    // Decrement the count of number of edges    // and mark current vertex as unvisited    visited[src] = false;    edge_count--;}// Function to print minimum number of edges// It uses recursive minEdgeDFSUtilvoid Graph::minEdgeDFS(int u, int v){    // To keep track of all the    // visited vertices    vector<bool> visited(V, false);    // To store minimum number of edges    int min_num_of_edges = INT_MAX;    // To store total number of    // edges in each path    int edge_count = 0;    minEdgeDFSUtil(visited, u, v, min_num_of_edges,                   edge_count);    // Print the minimum number of edges    cout << min_num_of_edges;}// Driver Codeint main(){    // Create a graph    Graph g(5);    g.addEdge(0, 1);    g.addEdge(0, 4);    g.addEdge(1, 2);    g.addEdge(2, 4);    g.addEdge(2, 3);    g.addEdge(3, 4);    int u = 0;    int v = 3;    g.minEdgeDFS(u, v);    return 0;} | 
Java
// Java program to find minimum // number of edges between any two // vertices of the graph import java.io.*;import java.util.*;class GFG {    static int min_num_of_edges = 0, edge_count = 0;    // Class to represent a graph    static class Graph    {        // No. of vertices        int V;        // Pointer to an array containing        // adjacency lists        Vector<Integer>[] adj;        // A function used by minEdgeDFS        // Utility function for finding minimum number        // of edges using DFS        private void minEdgeDFSUtil(boolean[] visited,                                     int src, int des)         {            // For keeping track of visited            // nodes in DFS            visited[src] = true;            // If we have found the destination vertex            // then check whether count of total number of edges            // is less than the minimum number of edges or not            if (src == des)            {                if (min_num_of_edges > edge_count)                    min_num_of_edges = edge_count;            }            // If current vertex is not destination            else            {                for (int i : adj[src])                 {                    int v = i;                    if (!visited[v])                     {                        edge_count++;                        minEdgeDFSUtil(visited, v, des);                    }                }            }            // Decrement the count of number of edges            // and mark current vertex as unvisited            visited[src] = false;            edge_count--;        }        // Constructor        @SuppressWarnings("unchecked")        Graph(int V) {            this.V = V;            adj = new Vector[V];            for (int i = 0; i < V; i++)                adj[i] = new Vector<>();        }        // Function to add an edge to graph        void addEdge(int src, int des)         {            adj[src].add(des);            adj[des].add(src);        }        // Function to print minimum number of edges        // It uses recursive minEdgeDFSUtil        void minEdgeDFS(int u, int v)        {            // To keep track of all the            // visited vertices            boolean[] visited = new boolean[this.V];            Arrays.fill(visited, false);            // To store minimum number of edges            min_num_of_edges = Integer.MAX_VALUE;            // To store total number of            // edges in each path            edge_count = 0;            minEdgeDFSUtil(visited, u, v);            // Print the minimum number of edges            System.out.println(min_num_of_edges);        }    }    // Driver Code    public static void main(String[] args)    {        // Create a graph        Graph g = new Graph(5);        g.addEdge(0, 1);        g.addEdge(0, 4);        g.addEdge(1, 2);        g.addEdge(2, 4);        g.addEdge(2, 3);        g.addEdge(3, 4);        int u = 0;        int v = 3;        g.minEdgeDFS(u, v);    }}// This code is contributed by// sanjeev2552 | 
Python3
# Python3 program to find minimum # number of edges between any two # vertices of the graph # Class to represent a graph class Graph:      def __init__(self, V):        self.V = V        self.adj = [[] for i in range(V)]             def addEdge(self, src, des):           self.adj[src].append(des)         self.adj[des].append(src)       # Utility function for finding     # minimum number of edges using DFS     def minEdgeDFSUtil(self, visited, src, des, min_num_of_edges, edge_count):               # For keeping track of visited nodes in DFS         visited[src] = True             # If we have found the destination vertex         # then check whether count of total number of edges         # is less than the minimum number of edges or not         if src == des:             if min_num_of_edges > edge_count:                 min_num_of_edges = edge_count                   # If current vertex is not destination         else:                   # Recur for all the vertices             # adjacent to current vertex             for v in self.adj[src]:                                   if not visited[v]:                      edge_count += 1                         min_num_of_edges, edge_count = \                    self.minEdgeDFSUtil(visited, v, des, min_num_of_edges, edge_count)                           # Decrement the count of number of edges         # and mark current vertex as unvisited         visited[src] = False        edge_count -= 1        return min_num_of_edges, edge_count          # Function to print minimum number of     # edges. It uses recursive minEdgeDFSUtil     def minEdgeDFS(self, u, v):               # To keep track of all the         # visited vertices         visited = [False] * self.V              # To store minimum number of edges         min_num_of_edges = float('inf')              # To store total number of         # edges in each path         edge_count = 0             min_num_of_edges, edge_count = \        self.minEdgeDFSUtil(visited, u, v, min_num_of_edges, edge_count)              # Print the minimum number of edges         print(min_num_of_edges)   # Driver Code if __name__ == "__main__":       # Create a graph     g = Graph(5)     g.addEdge(0, 1)     g.addEdge(0, 4)     g.addEdge(1, 2)     g.addEdge(2, 4)     g.addEdge(2, 3)     g.addEdge(3, 4)     u, v = 0, 3    g.minEdgeDFS(u, v) # This code is contributed by Rituraj Jain | 
C#
// C# program to find minimum // number of edges between any two // vertices of the graph using System;using System.Collections;class GFG{ static int min_num_of_edges = 0,                  edge_count = 0; // Class to represent a graph class Graph {          // No. of vertices     public int V;     // Pointer to an array containing     // adjacency lists     public ArrayList []adj;     // A function used by minEdgeDFS     // Utility function for finding     // minimum number of edges using DFS     public void minEdgeDFSUtil(bool[] visited,                                int src, int des)     {                  // For keeping track of visited         // nodes in DFS         visited[src] = true;         // If we have found the destination         // vertex then check whether count        // of total number of edges is less         // than the minimum number of edges or not         if (src == des)         {             if (min_num_of_edges > edge_count)                 min_num_of_edges = edge_count;         }         // If current vertex is not destination         else        {             foreach(int i in adj[src])             {                 int v = i;                 if (!visited[v])                 {                     edge_count++;                     minEdgeDFSUtil(visited, v, des);                 }             }         }         // Decrement the count of number of edges         // and mark current vertex as unvisited         visited[src] = false;         edge_count--;     }     public Graph(int V)     {         this.V = V;         adj = new ArrayList[V];         for(int i = 0; i < V; i++)             adj[i] = new ArrayList();     }     // Function to add an edge to graph     public void addEdge(int src, int des)     {         adj[src].Add(des);         adj[des].Add(src);     }     // Function to print minimum number of edges     // It uses recursive minEdgeDFSUtil     public void minEdgeDFS(int u, int v)     {         // To keep track of all the         // visited vertices         bool[] visited = new bool[this.V];         Array.Fill(visited, false);         // To store minimum number of edges         min_num_of_edges = Int32.MaxValue;         // To store total number of         // edges in each path         edge_count = 0;         minEdgeDFSUtil(visited, u, v);         // Print the minimum number of edges         Console.Write(min_num_of_edges);     } } // Driver Code public static void Main(string[] args) {     // Create a graph     Graph g = new Graph(5);     g.addEdge(0, 1);     g.addEdge(0, 4);     g.addEdge(1, 2);     g.addEdge(2, 4);     g.addEdge(2, 3);     g.addEdge(3, 4);     int u = 0;     int v = 3;          g.minEdgeDFS(u, v); } } // This code is contributed by rutvik_56 | 
Javascript
// Class to represent a graphclass Graph {constructor(V) {this.V = V;this.adj = [];for (let i = 0; i < V; i++) {this.adj[i] = [];}}addEdge(src, des) {this.adj[src].push(des);this.adj[des].push(src);}// Utility function for finding// minimum number of edges using DFSminEdgeDFSUtil(visited, src, des, min_num_of_edges, edge_count) {// For keeping track of visited nodes in DFSvisited[src] = true;// If we have found the destination vertex // then check whether count of total number of edges // is less than the minimum number of edges or not if (src == des) {  if (min_num_of_edges > edge_count) {    min_num_of_edges = edge_count;  }} else {  // Recur for all the vertices   // adjacent to current vertex   for (let v of this.adj[src]) {    if (!visited[v]) {      edge_count++;      const result = this.minEdgeDFSUtil(visited, v, des,       min_num_of_edges, edge_count);      min_num_of_edges = result[0];      edge_count = result[1];    }  }}// Decrement the count of number of edges // and mark current vertex as unvisited visited[src] = false;edge_count--;return [min_num_of_edges, edge_count];}// Function to print minimum number of// edges. It uses recursive minEdgeDFSUtilminEdgeDFS(u, v) {// To keep track of all the// visited verticeslet visited = [];for (let i = 0; i < this.V; i++) {visited[i] = false;}// To store minimum number of edges let min_num_of_edges = Number.POSITIVE_INFINITY;// To store total number of // edges in each path let edge_count = 0;const result = this.minEdgeDFSUtil(visited, u, v, min_num_of_edges, edge_count);min_num_of_edges = result[0];edge_count = result[1];// Print the minimum number of edges console.log(min_num_of_edges);}}// Driver Code// Create a graphconst g = new Graph(5);g.addEdge(0, 1);g.addEdge(0, 4);g.addEdge(1, 2);g.addEdge(2, 4);g.addEdge(2, 3);g.addEdge(3, 4);const u = 0;const v = 3;g.minEdgeDFS(u, v); | 
2
Complexity Analysis:
- Time Complexity: O(V + E) where V and E are the numbers of vertices and edges in the graph respectively.
 - Auxiliary Space: O(V).
 
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

                                    