📜  断开连接图的 BFS

📅  最后修改于: 2022-05-13 01:57:54.351000             🧑  作者: Mango

断开连接图的 BFS

在上一篇文章中,仅对特定顶点执行 BFS,即假设所有顶点都可以从起始顶点到达。但是在不连接的图或从所有顶点都无法到达的任何顶点的情况下,以前的实现不会给出所需的输出,因此在这篇文章中,在 BFS 中进行了修改。

断开连接图 1 的 BFS
所有顶点都是可达的。因此,对于上图,简单的 BFS 将起作用。

断开连接图 2 的 BFS
如上图所示,所有顶点都无法到达顶点 1,因此简单的 BFS 无法解决此问题。

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

C++
// C++ implementation of modified BFS
#include
using namespace std;
  
// A utility function to add an edge in an
// undirected graph.
void addEdge(vector 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 adj[],
            vector &visited)
{
  
    // Create a queue for BFS
    list 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::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 adj[], int V)
{
    vector visited(V, false);
    for (int u=0; u 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;
}


Java
// Java implementation of modified BFS 
import java.util.*;
public class graph 
{
    //Implementing graph using HashMap
    static HashMap> 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 l=graph.get(a);
        l.add(b);
        graph.put(a,l);
    }
    else
    {
        LinkedList l=new LinkedList<>();
        l.add(b);
        graph.put(a,l);
    }
}
  
//Helper function for BFS 
public static void bfshelp(int s,ArrayList visited)
{
    // Create a queue for BFS 
    LinkedList 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 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 visited=new ArrayList();
    //Marking each node as unvisited
    for(int i=0;i


Python3
# 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::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] * V 
    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


C#
// C# implementation of modified BFS 
using System;
using System.Collections.Generic;
  
class Graph 
{ 
    //Implementing graph using Dictionary 
    static Dictionary> graph = 
            new Dictionary>(); 
  
//utility function to add edge in an undirected graph 
public static void addEdge(int a, int b) 
{ 
    if(graph.ContainsKey(a)) 
    { 
        List l = graph[a]; 
        l.Add(b); 
        if(graph.ContainsKey(a))
            graph[a] = l;
        else
            graph.Add(a,l); 
    } 
    else
    { 
        List l = new List(); 
        l.Add(b); 
        graph.Add(a, l); 
    } 
} 
  
// Helper function for BFS 
public static void bfshelp(int s, List visited) 
{ 
    // Create a queue for BFS 
    List q = new List(); 
      
    // Mark the current node as visited and enqueue it 
    q.Add(s); 
    visited.RemoveAt(s);
    visited.Insert(s,true); 
      
    while(q.Count != 0) 
    { 
        // Dequeue a vertex from queue and print it 
        int f = q[0]; 
        q.RemoveAt(0);
        Console.Write(f + " "); 
          
        //Check whether the current node is 
        //connected to any other node or not 
        if(graph.ContainsKey(f)) 
        { 
          
        // Get all adjacent vertices of the dequeued 
        // vertex f. If an adjacent has not been visited, 
        // then mark it visited and enqueue it 
          
            foreach(int iN in graph[f]) 
            { 
                int n = iN; 
                if(!visited[n]) 
                { 
                    visited.RemoveAt(n);
                    visited.Insert(n, true); 
                    q.Add(n); 
                } 
            } 
        } 
    } 
      
} 
  
// BFS function to check each node 
public static void bfs(int vertex) 
{ 
    List visited = new List(); 
      
    // Marking each node as unvisited 
    for(int i = 0; i < vertex; i++) 
    { 
        visited.Insert(i, false); 
    } 
    for(int i = 0; i < vertex; i++) 
    { 
        // Checking whether the node is visited or not 
        if(!visited[i]) 
        { 
            bfshelp(i, visited); 
        } 
    } 
} 
  
// Driver Code 
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); 
} 
} 
  
// This code is contributed by Rajput-Ji



输出:
0 4 1 2 3