How to Design a Print Using Vectors
BFS using vectors & queue as per the algorithm of CLRS
Breadth-first search traversal of a graph using the algorithm given in CLRS book.
BFS is one of the ways to traverse a graph. It is named so because it expands the frontier between discovered and undiscovered vertices uniformly across the breadth of the frontier. What it means is that the algorithm first discovers all the vertices connected to "u" at a distance of k before discovering the vertices at a distance of k+1 from u. The algorithm given in CLRS uses the concept of "colour" to check if a vertex is discovered fully or partially or undiscovered. It also keeps a track of the distance a vertex u is from the source s.
BFS(G,s) 1 for each vertex u in G.V - {s} 2 u.color = white 3 u.d = INF 4 u.p = NIL 5 s.color = green 6 s.d = 0 7 s.p = NIL 8 Q = NULL 9 ENQUEUE(Q,s) 10 while Q != NULL 11 u = DEQUEUE(Q) 12 for each v in G.Adj[u] 13 if v.color == white 14 v.color = green 15 v.d = u.d + 1 16 v.p = u 17 ENQUEUE(Q,v) 18 u.color = dark_green It produces a "breadth-first tree" with root s that contains all reachable vertices. Let's take a simple directed graph and see how BFS traverses it.
Attention reader! Don't stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready. To complete your preparation from learning a language to DS Algo and many more, please refer Complete Interview Preparation Course .
In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.
The graph
Starting of traversal
1st traversal
1st traversal completes
C++
#include <bits/stdc++.h>
using namespace std;
vector<string> colour;
vector< int > d;
vector< int > p;
void addEdge(vector < int > g[], int u, int v)
{
g[u].push_back(v);
g[v].push_back(u);
}
void BFSSingleSource(vector < int > g[], int s)
{
queue< int > q;
q.push(s);
d[s] = 0;
colour[s] = "green" ;
while (!q.empty())
{
int u = q.front();
q.pop();
cout << u << " " ;
for ( auto i = g[u].begin(); i != g[u].end(); i++)
{
if (colour[*i] == "white" )
{
colour[*i] = "green" ;
d[*i] = d[u] + 1;
p[*i] = u;
q.push(*i);
}
}
colour[u] = "dark_green" ;
}
}
void BFSFull(vector < int > g[], int n)
{
colour.assign(n, "white" );
d.assign(n, 0);
p.assign(n, -1);
for ( int i = 0; i < n; i++)
if (colour[i] == "white" )
BFSSingleSource(g, i);
}
int main()
{
int n = 7;
vector < int > g[n];
addEdge(g, 0, 1);
addEdge(g, 0, 2);
addEdge(g, 1, 3);
addEdge(g, 1, 4);
addEdge(g, 2, 5);
addEdge(g, 2, 6);
BFSFull(g, n);
return 0;
}
Python3
import queue
def addEdge(g, u, v):
g[u].append(v)
g[v].append(u)
def BFSSingleSource(g, s):
q = queue.Queue()
q.put(s)
d[s] = 0
colour[s] = "green"
while ( not q.empty()):
u = q.get()
print (u, end = " " )
i = 0
while i < len (g[u]):
if (colour[g[u][i]] = = "white" ):
colour[g[u][i]] = "green"
d[g[u][i]] = d[u] + 1
p[g[u][i]] = u
q.put(g[u][i])
i + = 1
colour[u] = "dark_green"
def BFSFull(g, n):
colour = [ "white" ] * n
d = [ 0 ] * n
p = [ - 1 ] * n
for i in range (n):
if (colour[i] = = "white" ):
BFSSingleSource(g, i)
n = 7
colour = [ None ] * n
d = [ None ] * n
p = [ None ] * n
g = [[] for i in range (n)]
addEdge(g, 0 , 1 )
addEdge(g, 0 , 2 )
addEdge(g, 1 , 3 )
addEdge(g, 1 , 4 )
addEdge(g, 2 , 5 )
addEdge(g, 2 , 6 )
BFSFull(g, n)
Javascript
<script>
var colour = [];
var d = [];
var p = [];
function addEdge(g, u, v)
{
g[u].push(v);
g[v].push(u);
}
function BFSSingleSource(g, s)
{
var q = [];
q.push(s);
d[s] = 0;
colour[s] = "green" ;
while (q.length!=0)
{
var u = q[0];
q.shift();
document.write( u + " " );
for ( var i of g[u])
{
if (colour[i] == "white" )
{
colour[i] = "green" ;
d[i] = d[u] + 1;
p[i] = u;
q.push(i);
}
}
colour[u] = "dark_green" ;
}
}
function BFSFull(g, n)
{
colour = Array(n).fill( "white" );
d = Array(n).fill(0);
p = Array(n).fill(0);
for ( var i = 0; i < n; i++)
if (colour[i] == "white" )
BFSSingleSource(g, i);
}
var n = 7;
var g = Array.from(Array(n), ()=>Array());
addEdge(g, 0, 1);
addEdge(g, 0, 2);
addEdge(g, 1, 3);
addEdge(g, 1, 4);
addEdge(g, 2, 5);
addEdge(g, 2, 6);
BFSFull(g, n);
</script>
Output:
0 1 2 3 4 5 6
How to Design a Print Using Vectors
Source: https://www.geeksforgeeks.org/bfs-using-vectors-queue-per-algorithm-clrs/
0 Response to "How to Design a Print Using Vectors"
Post a Comment