Given an undirected graph with V vertices and E edges and a node X, The task is to find the level of node X in the undirected graph. If X does not exist in the graph then return -1.
Note: Traverse the graph starting from vertex 0.
Examples:
Input: V = 5, Edges = {{0, 1}, {0, 2}, {1, 3}, {2, 4}}, X = 3
Output: 2
Explanation: Starting from vertex 0, at level 0 we have node 0, at level 1 we have nodes 1 and 2 and at level 2 we have nodes 3 and 4. So the answer is 2![]()
The example graph
Input: V = 5, Edges = {{0, 1}, {0, 2}, {1, 3}, {2, 4}}, X = 5
Output: -1
Explanation: Vertex 5 is not present in the given graph so answer is -1![]()
An example graph
Approach: The problem can be solved based on the following idea:
The given problem can be solved with the help of level order traversal. We can perform a BFS traversal in order to find the level of the given vertex
Follow the steps mentioned below to implement the idea:
- Find the maximum vertex of the graph and store it in a variable (say maxVertex).
- create adjacency list adj[] of size maxVertex+1.
- Check if X is present or not, if not then return -1.
- To traverse the graph, create a queue for level order traversal.
- Push vertex 0 in a queue, and set a counter level to 0.
- Create a visited array of size maxVertex+1 to mark the visited nodes.Â
- Start BFS traversal if the value of X is found in front of the queue then return the level.
- Keep popping nodes from the queue till it becomes empty and increment the counter level
- In one iteration, push all the unvisited nodes in the queue connected with the current node
- Increment the level variable to jump to the next level.
Below is the implementation of the above approach.
C++
// C++ code to implement the approach Â
#include <bits/stdc++.h> using namespace std; Â
// Function to find the level of the given node int findLevel( int N, vector<vector< int > >& edges, int X) { Â
    // Variable to store maximum vertex of graph     int maxVertex = 0;     for ( auto it : edges) {         maxVertex = max({ maxVertex, it[0], it[1] });     } Â
    // Creating adjacency list     vector< int > adj[maxVertex + 1];     for ( int i = 0; i < edges.size(); i++) {         adj[edges[i][0]].push_back(edges[i][1]);         adj[edges[i][1]].push_back(edges[i][0]);     } Â
    // If X is not present then return -1     if (X > maxVertex || adj[X].size() == 0)         return -1; Â
    // Initialize a Queue for BFS traversal     queue< int > q;     q.push(0);     int level = 0; Â
    // Visited array to mark the already visited nodes     vector< int > visited(maxVertex + 1, 0);     visited[0] = 1; Â
    // BFS traversal     while (!q.empty()) {         int sz = q.size();         while (sz--) {             auto currentNode = q.front();             q.pop();             if (currentNode == X) {                 return level;             } Â
            for ( auto it : adj[currentNode]) {                 if (!visited[it]) {                     q.push(it);                     visited[it] = 1;                 }             }         }         level++;     } Â
    return -1; } Â
// Driver Code int main() {     int V = 5;     vector<vector< int > > edges         = { { 0, 1 }, { 0, 2 }, { 1, 3 }, { 2, 4 } };     int X = 3; Â
    // Function call     int level = findLevel(V, edges, X);     cout << level << endl; Â
    return 0; } |
Java
// Java code to implement the approach Â
import java.util.*; class GFG { Â
    // Driver code     public static void main(String[] args)     {         int V = 5 ;         int [][] edges             = { { 0 , 1 }, { 0 , 2 }, { 1 , 3 }, { 2 , 4 } };         int X = 3 ; Â
        // Function call         int level = findLevel(V, edges, X);         System.out.println(level);     } Â
    // Function to find the level of the node     public static int findLevel( int N, int [][] edges, int X)     {         int maxVertex = 0 ;         for ( int [] it : edges) {             maxVertex = Math.max(maxVertex,                                  Math.max(it[ 0 ], it[ 1 ]));         } Â
        // Creating adjacency list         ArrayList<Integer>[] adj             = new ArrayList[maxVertex + 1 ]; Â
        for ( int i = 0 ; i <= maxVertex; i++)             adj[i] = new ArrayList<>(); Â
        for ( int i = 0 ; i < edges.length; i++) {             adj[edges[i][ 0 ]].add(edges[i][ 1 ]);             adj[edges[i][ 1 ]].add(edges[i][ 0 ]);         } Â
        // X is not present         if (X > maxVertex || adj[X].size() == 0 )             return - 1 ; Â
        // Queue for BFS traversal         LinkedList<Integer> q = new LinkedList<>();         q.offer( 0 );         int level = 0 ; Â
        boolean [] visited = new boolean [maxVertex + 1 ]; Â
        // BFS traversal         while (!q.isEmpty()) {             int sz = q.size();             while (sz-- > 0 ) {                 int currentNode = q.poll(); Â
                if (currentNode == X)                     return level; Â
                for ( int it : adj[currentNode]) {                     if (!visited[it]) {                         q.offer(it);                         visited[it] = true ;                     }                 }             }             level++;         } Â
        return - 1 ;     } } |
Python3
# Python code to implement the approach Â
# Function to find the level of the given node def findLevel(N,edges,X):     # Variable to store maximum vertex of graph     maxVertex = 0     for it in edges:         maxVertex = max (maxVertex, max (it[ 0 ],it[ 1 ]))          # Creating adjacency list     adj = [[] for j in range (maxVertex + 1 )]     for i in range ( len (edges)):         adj[edges[i][ 0 ]].append(edges[i][ 1 ])         adj[edges[i][ 1 ]].append(edges[i][ 0 ])          # If X is not present then return -1     if (X>maxVertex or len (adj[X]) = = 0 ):         return - 1          # Initialize a Queue for BFS traversal     q = []     q.append( 0 )     level = 0          # Visited array to mark the already visited nodes     visited = [ 0 ] * (maxVertex + 1 )     visited[ 0 ] = 1          # BFS traversal     while ( len (q)> 0 ):         sz = len (q)         while (sz> 0 ):             currentNode = q[ 0 ]             q.pop( 0 )             if (currentNode = = X):                 return level             for it in adj[currentNode]:                 if ( not visited[it]):                     q.append(it)                     visited[it] = 1             sz = sz - 1         level = level + 1              return - 1 Â
# Driver Code V = 5 edges = [[ 0 , 1 ],[ 0 , 2 ],[ 1 , 3 ],[ 2 , 4 ]] X = 3 Â
#Function call level = findLevel(V,edges,X) print (level) Â
# This code is contributed by Pushpesh Raj. |
C#
// C# code to implement the approach using System; using System.Collections.Generic; using System.Collections; class GFG { Â
    // Function to find the level of the given node     static int findLevel( int N, int [, ] edges, int X)     {                // Variable to store maximum vertex of graph         int maxVertex = 0;         for ( int i = 0; i < edges.GetLength(0); i++) {             maxVertex = Math.Max(                 maxVertex,                 Math.Max(edges[i, 0], edges[i, 1]));         }         // Creating adjacency list         List< int >[] adj = new List< int >[ maxVertex + 1 ];         for ( int i = 0; i <= maxVertex; i++)             adj[i] = new List< int >();         for ( int i = 0; i < edges.GetLength(0); i++) {             adj[edges[i, 0]].Add(edges[i, 1]);             adj[edges[i, 1]].Add(edges[i, 0]);         } Â
        // If X is not present then return -1         if (X > maxVertex || adj[X].Count == 0)             return -1; Â
        // Initialize a Queue for BFS traversal         Queue q = new Queue();         q.Enqueue(0);         int level = 0;         // Visited array to mark the already visited nodes         int [] visited = new int [maxVertex + 1];         for ( int i = 0; i <= maxVertex; i++)             visited[i] = 0;         visited[0] = 1;         // BFS traversal         while (q.Count != 0) {             int sz = q.Count;             while (sz-- != 0) {                 int currentNode = ( int )q.Dequeue();                 if (currentNode == X) {                     return level;                 } Â
                for ( int i = 0; i < adj[currentNode].Count;                      i++) {                     int it = adj[currentNode][i];                     if (visited[it] == 0) {                         q.Enqueue(it);                         visited[it] = 1;                     }                 }             }             level++;         }         return -1;     } Â
    static void Main()     {         int V = 5;         int [, ] edges = new int [, ] {             { 0, 1 }, { 0, 2 }, { 1, 3 }, { 2, 4 }         };         int X = 3; Â
        // Function call         int level = findLevel(V, edges, X);         Console.Write(level);     } } Â
// This code is contributed by garg28harsh. |
Javascript
// JS code to implement the approach Â
// Function to find the level of the given node function findLevel( N, edges, X) {     // Variable to store maximum vertex of graph     let maxVertex = 0;     for (let i=0;i<edges.length;i++){         let it = edges[i];         let a = Math.max(it[0],it[1]);         maxVertex = Math.max(maxVertex,a);     } Â
    // Creating adjacency list     let adj = [];     for (let i=0;i<maxVertex+1;i++){         adj.push([]);     }     for (let i = 0; i < edges.length; i++) {         adj[edges[i][0]].push(edges[i][1]);         adj[edges[i][1]].push(edges[i][0]);     } Â
    // If X is not present then return -1     if (X > maxVertex || adj[X].length == 0)         return -1; Â
    // Initialize a Queue for BFS traversal     let q = [];     q.push(0);     let level = 0; Â
    // Visited array to mark the already visited nodes     let visited = [];     for (let i=0;i<maxVertex+1;i++)     {         visited.push(0);     }     visited[0] = 1; Â
    // BFS traversal          while (q.length > 0) {         let sz = q.length;         while (sz--) {             let currentNode = q[0];             q.shift();             if (currentNode == X) {                 return level;             } Â
            for (let k =0;k<adj[currentNode].length;k++){                 let it = adj[currentNode][k];                 if (visited[it]==0) {                     q.push(it);                     visited[it] = 1;                 }             }         }         level++;     } Â
    return -1; } Â
// Driver Code let V = 5; let edges     = [ [ 0, 1 ], [ 0, 2 ], [ 1, 3 ], [ 2, 4 ] ]; let X = 3; Â
// Function call let level = findLevel(V, edges, X); console.log(level); Â
// This code is contributed by ksam24000 |
2
Time Complexity: O(V + E) For traversing all of the nodes.
Auxiliary Space: O(V) to store all the nodes in the queue.
Related Articles:
- Introduction to Graphs – Data Structure and Algorithm Tutorials
- Breadth First Search or BFS for a Graph
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!