非连通图的BFS

以前 邮递 ,只对特定顶点执行BFS,即假设所有顶点都可以从起始顶点到达。但是,对于断开连接的图或从所有顶点都无法到达的任何顶点,之前的实现不会给出所需的输出,因此在本文中,BFS中进行了修改。

null

BFS for Disconnected Graph 1 所有顶点都是可到达的。所以,对于上面的图来说很简单 BFS 会有用的。

BFS for Disconnected Graph 2 如上图所示,所有顶点都无法到达顶点1,所以简单的BFS不适用于它。

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

C++

// 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;
}


JAVA

// 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);
}
}


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<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 ] * 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< int ,List< int >> graph =
new Dictionary< int ,List< int >>();
//utility function to add edge in an undirected graph
public static void addEdge( int a, int b)
{
if (graph.ContainsKey(a))
{
List< int > l = graph[a];
l.Add(b);
if (graph.ContainsKey(a))
graph[a] = l;
else
graph.Add(a,l);
}
else
{
List< int > l = new List< int >();
l.Add(b);
graph.Add(a, l);
}
}
// Helper function for BFS
public static void bfshelp( int s, List<Boolean> visited)
{
// Create a queue for BFS
List< int > q = new List< int >();
// 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<Boolean> visited = new List<Boolean>();
// 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

本文由 萨希尔·查布拉(阿克库) .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 写极客。组织 或者把你的文章寄去评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。

如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享