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