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

The graph



Starting of traversal

Starting of traversal

1st traversal

1st traversal

1st traversal completes

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

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel