C++ :: Breadth-first search algorithm (BFS)
Breadth-first search গ্রাফ অনুসন্ধানের জন্য একটি সহজ অ্যালগরিদম এবং অনেক গুরুত্বপূর্ণ গ্রাফ অ্যালগরিদমের জন্য এটি হচ্ছে মূল আদর্শ। Prim’s minimum-spanning tree অ্যালগরিদম এবং Dijkstra’s single-source shortest-paths অ্যালগরিদম Breadth-first search -এর আইডিয়াগুলি অনুসরন করে।
.:: PSEUDOCODE ::.
BFS(G,s)
for each vertex u ∈ G.V - {s}
u.color = WHITE
u.d = ∞
u.π = NIL
s.color = GRAY
s.d = 0
s.π = NIL
Q = ∅
ENQUEUE(Q,s)
while Q ≠ ∅
u = DEQUEUE(Q)
for each v ∈ G.Adj[u]
if v.color == WHITE
v.color = GRAY
v.d = u.d + 1
v.π = u
ENQUEUE(Q,v)
u.color = BLACK

.:: C++ Code ::.
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <limits>
#define MAX 101
using namespace std;
enum colors {BLACK, WHITE, GRAY};
int color[MAX], d[MAX], p[MAX], vertex, edge;
int INF = numeric_limits<int>::max();
int NIL = numeric_limits<int>::min();
void BFS(vector<int>[],int);
void PRINT_PATH(vector<int>[],int,int);
int main(void)
{
//freopen("bfs.txt", "r", stdin);
vector<int> adjList[MAX];
int u, v;
cin >> vertex >> edge;
for(int e=1; e<=edge; e++) {
cin >> u >> v;
adjList[u].push_back(v);
adjList[v].push_back(u);
}
BFS(adjList, 1);
PRINT_PATH(adjList, 1, 4);
return 0;
}
void BFS(vector<int> G[], int s) {
for(int u=0; u<=vertex; u++) {
color[u] = WHITE;
d[u] = INF;
p[u] = NIL;
}
color[s] = GRAY;
d[s] = 0;
p[s] = NIL;
queue<int> Q; Q.push(s);
while( !Q.empty()) {
int u = Q.front(); Q.pop();
for(int i=0; i<G[u].size(); i++) {
if(color[G[u][i]] == WHITE) {
color[G[u][i]] = GRAY;
d[G[u][i]] = d[u] + 1;
p[G[u][i]] = u;
Q.push(G[u][i]);
}
}
color[u] = BLACK;
}
}
void PRINT_PATH(vector<int> G[], int s, int v) {
if(v == s)
cout << s;
else if(p[v] == NIL)
cout << "no path from " << s << " to " << v << " exists";
else {
PRINT_PATH(G, s, p[v]);
cout << " -> ";
cout << v;
}
}
.:: Sample Input ::.
6 10 1 2 1 5 2 6 3 4 3 6 3 7 4 7 4 8 6 7 7 8
.:: Sample Output ::.
1 -> 2 -> 6 -> 3 -> 4
.:: BFS Related UVa Problems ::.
- 314 - Robot
- 417 - Word Index
- 439 - Knight Moves
- 532 - Dungeon Master
- 567 - Risk
- 10044 - Erdos numbers
- 10047 - The Monocycle
- 10067 - Playing with Wheels
- 10682 - Forro Party
- 10993 - Ignoring Digits
- 11352 - Crazy King
Refference: Introduction to Algorithms - Thomas H. Cormen