#include <iostream>
#include <vector>
#include <queue>
#include <omp.h>
using namespace std;
class Graph {
int V;
vector<vector<int>> adj;
public:
Graph(int V) {
this->V = V;
adj.resize(V);
}
void addEdge(int u, int v) {
adj[u].push_back(v);
adj[v].push_back(u); // undirected graph
}
void parallelBFS(int start) {
vector<bool> visited(V, false);
queue<int> q;
visited[start] = true;
q.push(start);
while (!q.empty()) {
int node = q.front();
q.pop();
cout << node << " ";
#pragma omp parallel for
for (int i = 0; i < adj[node].size(); i++) {
int neighbor = adj[node][i];
if (!visited[neighbor]) {
#pragma omp critical
{
if (!visited[neighbor]) {
visited[neighbor] = true;
q.push(neighbor);
}
}
}
}
}
}
};
int main() {
Graph g(6);
g.addEdge(0,1);
g.addEdge(0,2);
g.addEdge(1,3);
g.addEdge(1,4);
g.addEdge(2,5);
cout << "Parallel BFS Traversal:\n";
g.parallelBFS(0);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDxvbXAuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBHcmFwaCB7CiAgICBpbnQgVjsKICAgIHZlY3Rvcjx2ZWN0b3I8aW50Pj4gYWRqOwoKcHVibGljOgogICAgR3JhcGgoaW50IFYpIHsKICAgICAgICB0aGlzLT5WID0gVjsKICAgICAgICBhZGoucmVzaXplKFYpOwogICAgfQoKICAgIHZvaWQgYWRkRWRnZShpbnQgdSwgaW50IHYpIHsKICAgICAgICBhZGpbdV0ucHVzaF9iYWNrKHYpOwogICAgICAgIGFkalt2XS5wdXNoX2JhY2sodSk7ICAvLyB1bmRpcmVjdGVkIGdyYXBoCiAgICB9CgogICAgdm9pZCBwYXJhbGxlbEJGUyhpbnQgc3RhcnQpIHsKICAgICAgICB2ZWN0b3I8Ym9vbD4gdmlzaXRlZChWLCBmYWxzZSk7CiAgICAgICAgcXVldWU8aW50PiBxOwoKICAgICAgICB2aXNpdGVkW3N0YXJ0XSA9IHRydWU7CiAgICAgICAgcS5wdXNoKHN0YXJ0KTsKCiAgICAgICAgd2hpbGUgKCFxLmVtcHR5KCkpIHsKICAgICAgICAgICAgaW50IG5vZGUgPSBxLmZyb250KCk7CiAgICAgICAgICAgIHEucG9wKCk7CgogICAgICAgICAgICBjb3V0IDw8IG5vZGUgPDwgIiAiOwoKICAgICAgICAgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yCiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWRqW25vZGVdLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICBpbnQgbmVpZ2hib3IgPSBhZGpbbm9kZV1baV07CgogICAgICAgICAgICAgICAgaWYgKCF2aXNpdGVkW25laWdoYm9yXSkgewogICAgICAgICAgICAgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZpc2l0ZWRbbmVpZ2hib3JdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXNpdGVkW25laWdoYm9yXSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxLnB1c2gobmVpZ2hib3IpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9OwoKaW50IG1haW4oKSB7CgogICAgR3JhcGggZyg2KTsKCiAgICBnLmFkZEVkZ2UoMCwxKTsKICAgIGcuYWRkRWRnZSgwLDIpOwogICAgZy5hZGRFZGdlKDEsMyk7CiAgICBnLmFkZEVkZ2UoMSw0KTsKICAgIGcuYWRkRWRnZSgyLDUpOwoKICAgIGNvdXQgPDwgIlBhcmFsbGVsIEJGUyBUcmF2ZXJzYWw6XG4iOwogICAgZy5wYXJhbGxlbEJGUygwKTsKCiAgICByZXR1cm4gMDsKfQ==