BFS for Disconnected Graph

In previous post, BFS only with a particular vertex is performed i.e. it is assumed that all vertices are reachable from the starting vertex. But in the case of disconnected graph or any vertex that is unreachable from all vertex, the previous implementation will not give the desired output, so in this post, a modification is done in BFS.


All vertices are reachable. So, for above graph simple BFS will work.

graph
As in above graph a vertex 1 is unreachable from all vertex, so simple BFS wouldn’t work for it.

Just to modify BFS, perform simple BFS from each 
unvisited vertex of given graph.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of modified BFS
#include<bits/stdc++.h>
using namespace std;
  
// A utility function to add an edge in an
// undirected graph.
void addEdge(vector<int> adj[], int u, int v)
{
    adj[u].push_back(v);
}
  
// A utility function to do BFS of graph
// from a given vertex u.
void BFSUtil(int u, vector<int> adj[],
            vector<bool> &visited)
{
  
    // Create a queue for BFS
    list<int> q;
   
    // Mark the current node as visited and enqueue it
    visited[u] = true;
    q.push_back(u);
   
    // 'i' will be used to get all adjacent vertices 4
    // of a vertex list<int>::iterator i;
   
    while(!q.empty())
    {
        // Dequeue a vertex from queue and print it
        u = q.front();
        cout << u << " ";
        q.pop_front();
   
        // Get all adjacent vertices of the dequeued
        // vertex s. If an adjacent has not been visited, 
        // then mark it visited and enqueue it
        for (int i = 0; i != adj[u].size(); ++i)
        {
            if (!visited[adj[u][i]])
            {
                visited[adj[u][i]] = true;
                q.push_back(adj[u][i]);
            }
        }
    }
}
  
// This function does BFSUtil() for all 
// unvisited vertices.
void BFS(vector<int> adj[], int V)
{
    vector<bool> visited(V, false);
    for (int u=0; u<V; u++)
        if (visited[u] == false)
            BFSUtil(u, adj, visited);
}
  
// Driver code
int main()
{
    int V = 5;
    vector<int> adj[V];
  
    addEdge(adj, 0, 4);
    addEdge(adj, 1, 2);
    addEdge(adj, 1, 3);
    addEdge(adj, 1, 4);
    addEdge(adj, 2, 3);
    addEdge(adj, 3, 4);
    BFS(adj, V);
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation of modified BFS 
import java.util.*;
public class graph 
{
    //Implementing graph using HashMap
    static HashMap<Integer,LinkedList<Integer>> graph=new HashMap<>();
  
    //utility function to add edge in an undirected graph
public static void addEdge(int a,int b)
{
    if(graph.containsKey(a))
    {
        LinkedList<Integer> l=graph.get(a);
        l.add(b);
        graph.put(a,l);
    }
    else
    {
        LinkedList<Integer> l=new LinkedList<>();
        l.add(b);
        graph.put(a,l);
    }
}
  
//Helper function for BFS 
public static void bfshelp(int s,ArrayList<Boolean> visited)
{
    // Create a queue for BFS 
    LinkedList<Integer> q=new LinkedList<>();
      
    // Mark the current node as visited and enqueue it 
    q.add(s);
    visited.set(s,true);
      
    while(!q.isEmpty())
    {
        // Dequeue a vertex from queue and print it 
        int f=q.poll();
        System.out.print(f+" ");
          
        //Check whether the current node is 
                //connected to any other node or not
        if(graph.containsKey(f))
        {
        Iterator<Integer> i=graph.get(f).listIterator();
          
        // Get all adjacent vertices of the dequeued 
        // vertex f. If an adjacent has not been visited,  
        // then mark it visited and enqueue it 
          
            while(i.hasNext())
            {
                int n=i.next();
                if(!visited.get(n))
                {
                visited.set(n,true);
                q.add(n);
                }
            }
        }
    }
      
}
  
//BFS function to check each node
public static void bfs(int vertex)
{
    ArrayList<Boolean> visited=new ArrayList<Boolean>();
    //Marking each node as unvisited
    for(int i=0;i<vertex;i++)
    {
        visited.add(i,false);
    }
    for(int i=0;i<vertex;i++)
    {
        //Checking whether the node is visited or not
        if(!visited.get(i))
        {
            bfshelp(i,visited);
        }
    }
}
  
//Driver Code-The main function
    public static void main(String[] args) 
    {
        int v=5;
        addEdge(0, 4); 
        addEdge(1, 2); 
        addEdge(1, 3); 
        addEdge(1, 4); 
        addEdge(2, 3); 
        addEdge(3, 4); 
        bfs(v);
    }
  
}

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 implementation of modified BFS 
import queue
  
# A utility function to add an edge 
# in an undirected graph. 
def addEdge(adj, u, v):
    adj[u].append(v)
  
# A utility function to do BFS of 
# graph from a given vertex u. 
def BFSUtil(u, adj, visited):
  
    # Create a queue for BFS 
    q = queue.Queue()
      
    # Mark the current node as visited
    # and enqueue it 
    visited[u] = True
    q.put(u) 
      
    # 'i' will be used to get all adjacent 
    # vertices 4 of a vertex list<int>::iterator i 
      
    while(not q.empty()):
          
        # Dequeue a vertex from queue 
        # and print it 
        u = q.queue[0
        print(u, end = " "
        q.get() 
      
        # Get all adjacent vertices of the 
        # dequeued vertex s. If an adjacent 
        # has not been visited, then mark 
        # it visited and enqueue it 
        i = 0
        while i != len(adj[u]):
            if (not visited[adj[u][i]]):
                    visited[adj[u][i]] = True
                    q.put(adj[u][i])
            i += 1
  
# This function does BFSUtil() for all 
# unvisited vertices. 
def BFS(adj, V):
    visited = [False] *
    for u in range(V):
        if (visited[u] == False): 
            BFSUtil(u, adj, visited)
  
# Driver code 
if __name__ == '__main__':
  
    V = 5
    adj = [[] for i in range(V)] 
  
    addEdge(adj, 0, 4
    addEdge(adj, 1, 2
    addEdge(adj, 1, 3
    addEdge(adj, 1, 4
    addEdge(adj, 2, 3
    addEdge(adj, 3, 4
    BFS(adj, V)
  
# This code is contributed by PranchalK

chevron_right



Output:

0 4 1 2 3

This article is contributed by Sahil Chhabra (akku). If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

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



My Personal Notes arrow_drop_up

Improved By : PranchalKatiyar, perdio



Article Tags :
Practice Tags :


Be the First to upvote.


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