#include <iostream>
#include <vector>
#include <queue>
#include <omp.h>
using namespace std;
// Graph class representing the adjacency list
class Graph {
int V; // Number of vertices
vector<vector<int>> adj; // Adjacency list
public:
Graph(int V) : V(V), adj(V) {}
// Add an edge to the graph
void addEdge(int v, int w) {
adj[v].push_back(w);
}
// Parallel Depth-First Search
void parallelDFS(int startVertex) {
vector<bool> visited(V, false);
parallelDFSUtil(startVertex, visited);
}
// Parallel DFS utility function
void parallelDFSUtil(int v, vector<bool>& visited) {
visited[v] = true;
cout << v << " ";
#pragma omp parallel for
for (int i = 0; i < adj[v].size(); ++i) {
int n = adj[v][i];
if (!visited[n])
parallelDFSUtil(n, visited);
}
}
// Parallel Breadth-First Search
void parallelBFS(int startVertex) {
vector<bool> visited(V, false);
queue<int> q;
visited[startVertex] = true;
q.push(startVertex);
while (!q.empty()) {
int v = q.front();
q.pop();
cout << v << " ";
#pragma omp parallel for
for (int i = 0; i < adj[v].size(); ++i) {
int n = adj[v][i];
if (!visited[n]) {
visited[n] = true;
q.push(n);
}
}
}
}
};
int main() {
// Create a graph
Graph g(7);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 3);
g.addEdge(1, 4);
g.addEdge(2, 5);
g.addEdge(2, 6);
/*
0 -------->1
| / \
| / \
| / \
v v v
2 ----> 3 4
| |
| |
v v
5 6
*/
cout << "Depth-First Search (DFS): ";
g.parallelDFS(0);
cout << endl;
cout << "Breadth-First Search (BFS): ";
g.parallelBFS(0);
cout << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDxvbXAuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBHcmFwaCBjbGFzcyByZXByZXNlbnRpbmcgdGhlIGFkamFjZW5jeSBsaXN0CmNsYXNzIEdyYXBoIHsKICAgIGludCBWOyAgLy8gTnVtYmVyIG9mIHZlcnRpY2VzCiAgICB2ZWN0b3I8dmVjdG9yPGludD4+IGFkajsgIC8vIEFkamFjZW5jeSBsaXN0CgpwdWJsaWM6CiAgICBHcmFwaChpbnQgVikgOiBWKFYpLCBhZGooVikge30KCiAgICAvLyBBZGQgYW4gZWRnZSB0byB0aGUgZ3JhcGgKICAgIHZvaWQgYWRkRWRnZShpbnQgdiwgaW50IHcpIHsKICAgICAgICBhZGpbdl0ucHVzaF9iYWNrKHcpOwogICAgfQoKICAgIC8vIFBhcmFsbGVsIERlcHRoLUZpcnN0IFNlYXJjaAogICAgdm9pZCBwYXJhbGxlbERGUyhpbnQgc3RhcnRWZXJ0ZXgpIHsKICAgICAgICB2ZWN0b3I8Ym9vbD4gdmlzaXRlZChWLCBmYWxzZSk7CiAgICAgICAgcGFyYWxsZWxERlNVdGlsKHN0YXJ0VmVydGV4LCB2aXNpdGVkKTsKICAgIH0KCiAgICAvLyBQYXJhbGxlbCBERlMgdXRpbGl0eSBmdW5jdGlvbgogICAgdm9pZCBwYXJhbGxlbERGU1V0aWwoaW50IHYsIHZlY3Rvcjxib29sPiYgdmlzaXRlZCkgewogICAgICAgIHZpc2l0ZWRbdl0gPSB0cnVlOwogICAgICAgIGNvdXQgPDwgdiA8PCAiICI7CgogICAgICAgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvcgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWRqW3ZdLnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgIGludCBuID0gYWRqW3ZdW2ldOwogICAgICAgICAgICBpZiAoIXZpc2l0ZWRbbl0pCiAgICAgICAgICAgICAgICBwYXJhbGxlbERGU1V0aWwobiwgdmlzaXRlZCk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIFBhcmFsbGVsIEJyZWFkdGgtRmlyc3QgU2VhcmNoCiAgICB2b2lkIHBhcmFsbGVsQkZTKGludCBzdGFydFZlcnRleCkgewogICAgICAgIHZlY3Rvcjxib29sPiB2aXNpdGVkKFYsIGZhbHNlKTsKICAgICAgICBxdWV1ZTxpbnQ+IHE7CgogICAgICAgIHZpc2l0ZWRbc3RhcnRWZXJ0ZXhdID0gdHJ1ZTsKICAgICAgICBxLnB1c2goc3RhcnRWZXJ0ZXgpOwoKICAgICAgICB3aGlsZSAoIXEuZW1wdHkoKSkgewogICAgICAgICAgICBpbnQgdiA9IHEuZnJvbnQoKTsKICAgICAgICAgICAgcS5wb3AoKTsKICAgICAgICAgICAgY291dCA8PCB2IDw8ICIgIjsKCiAgICAgICAgICAgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvcgogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFkalt2XS5zaXplKCk7ICsraSkgewogICAgICAgICAgICAgICAgaW50IG4gPSBhZGpbdl1baV07CiAgICAgICAgICAgICAgICBpZiAoIXZpc2l0ZWRbbl0pIHsKICAgICAgICAgICAgICAgICAgICB2aXNpdGVkW25dID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBxLnB1c2gobik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn07CgppbnQgbWFpbigpIHsKICAgIC8vIENyZWF0ZSBhIGdyYXBoCiAgICBHcmFwaCBnKDcpOwogICAgZy5hZGRFZGdlKDAsIDEpOwogICAgZy5hZGRFZGdlKDAsIDIpOwogICAgZy5hZGRFZGdlKDEsIDMpOwogICAgZy5hZGRFZGdlKDEsIDQpOwogICAgZy5hZGRFZGdlKDIsIDUpOwogICAgZy5hZGRFZGdlKDIsIDYpOwogICAgCiAgICAvKgogICAgICAgIDAgLS0tLS0tLS0+MQogICAgICAgIHwgICAgICAgICAvIFwKICAgICAgICB8ICAgICAgICAvICAgXAogICAgICAgIHwgICAgICAgLyAgICAgXAogICAgICAgIHYgICAgICAgdiAgICAgICB2CiAgICAgICAgMiAtLS0tPiAzICAgICAgIDQKICAgICAgICB8ICAgICAgfAogICAgICAgIHwgICAgICB8CiAgICAgICAgdiAgICAgIHYKICAgICAgICA1ICAgICAgNgogICAgKi8KCiAgICBjb3V0IDw8ICJEZXB0aC1GaXJzdCBTZWFyY2ggKERGUyk6ICI7CiAgICBnLnBhcmFsbGVsREZTKDApOwogICAgY291dCA8PCBlbmRsOwoKICAgIGNvdXQgPDwgIkJyZWFkdGgtRmlyc3QgU2VhcmNoIChCRlMpOiAiOwogICAgZy5wYXJhbGxlbEJGUygwKTsKICAgIGNvdXQgPDwgZW5kbDsKCiAgICByZXR1cm4gMDsKfQ==