Given a graph with V vertices and E edges and two vertices u, v present in the graph. Find the minimum number of edges in the path between these two vertices. If the path doesn't exist, return -1.
Examples:
Input: u = 2, v = 5
Output: 2 Explanation: The path between vertex 2 and vertex 5: 2 -> 3 -> 5, has 2 edges.
Input: u = 1, v = 5
Output: -1 Explanation: There is no path between the two vertices.
[Naive Approach] Using DFS - O(N!) time and O(V) space
The idea is to perform a DFS traversal starting from vertex u. From each vertex, we recursively explore all possible paths to reach the destination vertex v, keeping track of the number of edges traversed. Whenever we reaches to v, we update the minimum count among all discovered paths. If no path is found after exploring all possibilities, we return -1.
C++
//Driver Code Starts#include<iostream>#include<vector>usingnamespacestd;//Driver Code Endsintdfs(intcurr,intdest,vector<vector<int>>&adj,vector<bool>&visited){if(curr==dest)return0;visited[curr]=true;intminEdges=(int)1e9;for(intnext:adj[curr]){if(!visited[next]){// moving to next nodes adds // 1 edge to the pathminEdges=min(minEdges,1+dfs(next,dest,adj,visited));}}visited[curr]=false;returnminEdges;}// function for finding minimum no. of // edges between u and vintminEdges(vector<vector<int>>&adj,intu,intv){intV=adj.size();vector<bool>visited(V,false);intminEdgesCount=dfs(u,v,adj,visited);returnminEdgesCount==(int)1e9?-1:minEdgesCount;//Driver Code Starts}voidaddEdge(vector<vector<int>>&adj,intu,intv){adj[u].push_back(v);adj[v].push_back(u);}intmain(){intV=6;vector<vector<int>>adj(V);// creating adjacency listaddEdge(adj,0,1);addEdge(adj,1,2);addEdge(adj,2,3);addEdge(adj,3,4);addEdge(adj,4,5);addEdge(adj,3,5);intu=2,v=5;intminEdgesCount=minEdges(adj,u,v);cout<<minEdgesCount<<endl;return0;}//Driver Code Ends
Java
//Driver Code Startsimportjava.util.ArrayList;classGfG{//Driver Code Ends// Method for finding minimum no. // of edges between u and vstaticintminEdges(ArrayList<ArrayList<Integer>>adj,intu,intv){intV=adj.size();boolean[]visited=newboolean[V];intminEdges=dfs(u,v,adj,visited);returnminEdges==(int)1e9?-1:minEdges;}staticintdfs(intcurr,intdest,ArrayList<ArrayList<Integer>>adj,boolean[]visited){if(curr==dest)return0;visited[curr]=true;intminEdges=(int)1e9;for(intnext:adj.get(curr)){if(!visited[next]){// moving to next nodes adds 1 edge to the pathminEdges=Math.min(minEdges,1+dfs(next,dest,adj,visited));}}visited[curr]=false;returnminEdges;}//Driver Code StartsstaticvoidaddEdge(ArrayList<ArrayList<Integer>>adj,intu,intv){adj.get(u).add(v);adj.get(v).add(u);}publicstaticvoidmain(String[]args){intV=6;ArrayList<ArrayList<Integer>>adj=newArrayList<>();// creating adjacency listfor(inti=0;i<V;i++)adj.add(newArrayList<>());addEdge(adj,0,1);addEdge(adj,1,2);addEdge(adj,2,3);addEdge(adj,3,4);addEdge(adj,4,5);addEdge(adj,3,5);intu=2,v=5;intminEdges=minEdges(adj,u,v);System.out.println(minEdges);}}//Driver Code Ends
Python
defdfs(curr,dest,adj,visited):ifcurr==dest:return0visited[curr]=TrueminEdges=10**9fornxtinadj[curr]:ifnotvisited[nxt]:# moving to next node adds # 1 edge to the pathminEdges=min(minEdges,1+dfs(nxt,dest,adj,visited))visited[curr]=falsereturnminEdges# Method for finding minimum no. # of edges between u and vdefminEdges(adj,u,v):V=len(adj)visited=[False]*Vres=dfs(u,v,adj,visited)return-1ifres==10**9elseres#Driver Code StartsdefaddEdge(adj,u,v):adj[u].append(v)adj[v].append(u)if__name__=="__main__":V=6adj=[]# creating adjacency listforiinrange(V):adj.append([])addEdge(adj,0,1)addEdge(adj,1,2)addEdge(adj,2,3)addEdge(adj,3,4)addEdge(adj,4,5)addEdge(adj,3,5)u,v=2,5print(minEdges(adj,u,v))#Driver Code Ends
C#
//Driver Code StartsusingSystem;usingSystem.Collections.Generic;classGfG{//Driver Code Endsstaticintdfs(intcurr,intdest,List<List<int>>adj,bool[]visited){if(curr==dest)return0;visited[curr]=true;intminEdges=(int)1e9;foreach(intnextinadj[curr]){if(!visited[next]){// moving to next nodes adds // 1 edge to the pathminEdges=Math.Min(minEdges,1+dfs(next,dest,adj,visited));}}visited[curr]=false;returnminEdges;}// Method for finding minimum // no. of edgeS between u and vstaticintminEdges(List<List<int>>adj,intu,intv){intV=adj.Count;bool[]visited=newbool[V];intminEdgesCount=dfs(u,v,adj,visited);returnminEdgesCount==(int)1e9?-1:minEdgesCount;//Driver Code Starts}staticvoidaddEdge(List<List<int>>adj,intu,intv){adj[u].Add(v);adj[v].Add(u);}staticvoidMain(){intV=6;List<List<int>>adj=newList<List<int>>();// creating adjacency listfor(inti=0;i<V;i++)adj.Add(newList<int>());addEdge(adj,0,1);addEdge(adj,1,2);addEdge(adj,2,3);addEdge(adj,3,4);addEdge(adj,4,5);addEdge(adj,3,5);intu=2,v=5;intminEdgesCount=minEdges(adj,u,v);Console.WriteLine(minEdgesCount);}}//Driver Code Ends
JavaScript
// Method for finding minimum // no. of edges between u and vfunctiondfs(curr,dest,adj,visited){if(curr===dest)return0;visited[curr]=true;letminEdges=1e9;for(letnextofadj[curr]){if(!visited[next]){// moving to next nodes adds // 1 edge to the pathminEdges=Math.min(minEdges,1+dfs(next,dest,adj,visited));}}visited[curr]=false;returnminEdges;}functionminEdges(adj,u,v){constV=adj.length;constvisited=newArray(V).fill(false);constminEdgesCount=dfs(u,v,adj,visited);returnminEdgesCount===1e9?-1:minEdgesCount;}//Driver Code StartsfunctionaddEdge(adj,u,v){adj[u].push(v);adj[v].push(u);}// Driver codeletV=6;letadj=[];// creating adjacency listfor(leti=0;i<V;i++)adj.push([]);addEdge(adj,0,1);addEdge(adj,1,2);addEdge(adj,2,3);addEdge(adj,3,4);addEdge(adj,4,5);addEdge(adj,3,5);constu=2,v=5;constminEdgesCount=minEdges(adj,u,v);console.log(minEdgesCount);//Driver Code Ends
Output
2
[Expected Approach] Using BFS - O(V+E) time and O(V) space
The idea is to perform a BFS starting from the source vertex while tracking the level (or distance) of each vertex. The first time the destination vertex is reached, the current level represents the minimum number of edges between the two nodes.
This works because BFS explores the graph level by level — it visits all nodes at distance 1 before distance 2, and so on. Hence, when we first encounter the destination, it’s guaranteed to be through the shortest possible path.
C++
//Driver Code Starts#include<iostream>#include<vector>#include<queue>usingnamespacestd;//Driver Code Endsintbfs(intsrc,intdest,vector<vector<int>>&adj,vector<bool>&visited){queue<pair<int,int>>q;q.push({src,0});while(!q.empty()){auto[curr,edges]=q.front();q.pop();if(visited[curr])continue;// return the first time we reach the destinationif(curr==dest)returnedges;visited[curr]=true;for(intnext:adj[curr]){q.push({next,edges+1});}}// no path foundreturn-1;}// function for finding minimum no. of // edges between u and vintminEdges(vector<vector<int>>&adj,intu,intv){intV=adj.size();vector<bool>visited(V,false);intminEdgesCount=bfs(u,v,adj,visited);returnminEdgesCount==(int)1e9?-1:minEdgesCount;}//Driver Code StartsvoidaddEdge(vector<vector<int>>&adj,intu,intv){adj[u].push_back(v);adj[v].push_back(u);}intmain(){intV=6;vector<vector<int>>adj(V);// creating adjacency listaddEdge(adj,0,1);addEdge(adj,1,2);addEdge(adj,2,3);addEdge(adj,3,4);addEdge(adj,4,5);addEdge(adj,3,5);intu=2,v=5;intminEdgesCount=minEdges(adj,u,v);cout<<minEdgesCount<<endl;return0;}//Driver Code Ends
Java
//Driver Code Startsimportjava.util.LinkedList;importjava.util.Queue;importjava.util.Vector;importjava.util.ArrayList;classTest{//Driver Code Ends// Method for finding minimum no. of edges// using BFSstaticintminEdges(ArrayList<ArrayList<Integer>>adj,intu,intv){intV=adj.size();boolean[]visited=newboolean[V];intminEdges=bfs(u,v,adj,visited);returnminEdges==(int)1e9?-1:minEdges;}staticintbfs(intsrc,intdest,ArrayList<ArrayList<Integer>>adj,boolean[]visited){Queue<int[]>queue=newLinkedList<>();queue.offer(newint[]{src,0});while(!queue.isEmpty()){int[]top=queue.poll();intcurr=top[0];intedges=top[1];if(visited[curr])continue;// return the first time we// reach the destinationif(curr==dest)returnedges;visited[curr]=true;for(intnext:adj.get(curr)){queue.offer(newint[]{next,edges+1});}}// no path foundreturn-1;}//Driver Code StartsstaticvoidaddEdge(ArrayList<ArrayList<Integer>>adj,intu,intv){adj.get(u).add(v);adj.get(v).add(u);}publicstaticvoidmain(String[]args){intV=6;ArrayList<ArrayList<Integer>>adj=newArrayList<>();// creating adjacency listfor(inti=0;i<V;i++)adj.add(newArrayList<>());addEdge(adj,0,1);addEdge(adj,1,2);addEdge(adj,2,3);addEdge(adj,3,4);addEdge(adj,4,5);addEdge(adj,3,5);intu=2;intv=5;intminEdges=minEdges(adj,u,v);System.out.println(minEdges);}}//Driver Code Ends
Python
#Driver Code Startsfromcollectionsimportdeque#Driver Code Endsdefbfs(src,dest,adj,visited):queue=deque()queue.append((src,0))whilequeue:curr,edges=queue.popleft()ifvisited[curr]:continue# return the first time we reach the destinationifcurr==dest:returnedgesvisited[curr]=Truefornext_nodeinadj[curr]:queue.append((next_node,edges+1))# no path foundreturn-1# Method for finding minimum no. # of edges between u and vdefminEdges(adj,u,v):V=len(adj)visited=[False]*Vres=bfs(u,v,adj,visited)return-1ifres==10**9elseres#Driver Code StartsdefaddEdge(adj,u,v):adj[u].append(v)adj[v].append(u)if__name__=="__main__":V=6adj=[]# creating adjacency listforiinrange(V):adj.append([])addEdge(adj,0,1)addEdge(adj,1,2)addEdge(adj,2,3)addEdge(adj,3,4)addEdge(adj,4,5)addEdge(adj,3,5)u,v=2,5print(minEdges(adj,u,v))#Driver Code Ends
C#
//Driver Code StartsusingSystem;usingSystem.Collections.Generic;classGFG{//Driver Code Ends// Method for finding minimum number of edges// between u and vstaticintMinEdges(List<List<int>>adj,intu,intv){intV=adj.Count;bool[]visited=newbool[V];intminEdges=bfs(u,v,adj,visited);returnminEdges==int.MaxValue?-1:minEdges;}staticintbfs(intsrc,intdest,List<List<int>>adj,bool[]visited){Queue<int[]>queue=newQueue<int[]>();queue.Enqueue(newint[]{src,0});while(queue.Count>0){int[]top=queue.Dequeue();intcurr=top[0];intedges=top[1];if(visited[curr])continue;// return the first time we reach the destinationif(curr==dest)returnedges;visited[curr]=true;foreach(intnextinadj[curr]){queue.Enqueue(newint[]{next,edges+1});}}// no path foundreturn-1;}//Driver Code StartsstaticvoidaddEdge(List<List<int>>adj,intu,intv){adj[u].Add(v);adj[v].Add(u);}staticvoidMain(){intV=6;List<List<int>>adj=newList<List<int>>();// creating adjacency listfor(inti=0;i<V;i++)adj.Add(newList<int>());addEdge(adj,0,1);addEdge(adj,1,2);addEdge(adj,2,3);addEdge(adj,3,4);addEdge(adj,4,5);addEdge(adj,3,5);intu=2,v=5;intminEdges=MinEdges(adj,u,v);Console.WriteLine(minEdges);}}//Driver Code Ends
JavaScript
// Method for finding minimum // no. of edges between u and vfunctionbfs(src,dest,adj,visited){// Using a standard array as queueletqueue=[];queue.push([src,0]);while(queue.length>0){let[curr,edges]=queue.shift();if(visited[curr])continue;// return the first time we reach the destinationif(curr===dest)returnedges;visited[curr]=true;for(letnextofadj[curr]){queue.push([next,edges+1]);}}// no path foundreturn-1;}functionminEdges(adj,u,v){constV=adj.length;constvisited=newArray(V).fill(false);constminEdgesCount=bfs(u,v,adj,visited);returnminEdgesCount===1e9?-1:minEdgesCount;}//Driver Code StartsfunctionaddEdge(adj,u,v){adj[u].push(v);adj[v].push(u);}// Driver codeletV=6;letadj=[];// creating adjacency listfor(leti=0;i<V;i++)adj.push([]);addEdge(adj,0,1);addEdge(adj,1,2);addEdge(adj,2,3);addEdge(adj,3,4);addEdge(adj,4,5);addEdge(adj,3,5);constu=2,v=5;constminEdgesCount=minEdges(adj,u,v);console.log(minEdgesCount);//Driver Code Ends