#include <iostream>
#include <vector>
#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);
}
void parallelDFSUtil(int node, vector<bool> &visited) {
#pragma omp critical
{
cout << node << " ";
}
visited[node] = true;
for (int i = 0; i < adj[node].size(); i++) {
int neighbor = adj[node][i];
if (!visited[neighbor]) {
#pragma omp task
parallelDFSUtil(neighbor, visited);
}
}
}
void parallelDFS(int start) {
vector<bool> visited(V, false);
#pragma omp parallel
{
#pragma omp single
{
parallelDFSUtil(start, visited);
}
}
}
};
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 DFS Traversal:\n";
g.parallelDFS(0);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8b21wLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgR3JhcGggewogICAgaW50IFY7CiAgICB2ZWN0b3I8dmVjdG9yPGludD4+IGFkajsKCnB1YmxpYzoKICAgIEdyYXBoKGludCBWKSB7CiAgICAgICAgdGhpcy0+ViA9IFY7CiAgICAgICAgYWRqLnJlc2l6ZShWKTsKICAgIH0KCiAgICB2b2lkIGFkZEVkZ2UoaW50IHUsIGludCB2KSB7CiAgICAgICAgYWRqW3VdLnB1c2hfYmFjayh2KTsKICAgICAgICBhZGpbdl0ucHVzaF9iYWNrKHUpOwogICAgfQoKICAgIHZvaWQgcGFyYWxsZWxERlNVdGlsKGludCBub2RlLCB2ZWN0b3I8Ym9vbD4gJnZpc2l0ZWQpIHsKCiAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKICAgICAgICB7CiAgICAgICAgICAgIGNvdXQgPDwgbm9kZSA8PCAiICI7CiAgICAgICAgfQoKICAgICAgICB2aXNpdGVkW25vZGVdID0gdHJ1ZTsKCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhZGpbbm9kZV0uc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgaW50IG5laWdoYm9yID0gYWRqW25vZGVdW2ldOwoKICAgICAgICAgICAgaWYgKCF2aXNpdGVkW25laWdoYm9yXSkgewoKICAgICAgICAgICAgICAgICNwcmFnbWEgb21wIHRhc2sKICAgICAgICAgICAgICAgIHBhcmFsbGVsREZTVXRpbChuZWlnaGJvciwgdmlzaXRlZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgdm9pZCBwYXJhbGxlbERGUyhpbnQgc3RhcnQpIHsKICAgICAgICB2ZWN0b3I8Ym9vbD4gdmlzaXRlZChWLCBmYWxzZSk7CgogICAgICAgICNwcmFnbWEgb21wIHBhcmFsbGVsCiAgICAgICAgewogICAgICAgICAgICAjcHJhZ21hIG9tcCBzaW5nbGUKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcGFyYWxsZWxERlNVdGlsKHN0YXJ0LCB2aXNpdGVkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfTsKCmludCBtYWluKCkgewoKICAgIEdyYXBoIGcoNik7CgogICAgZy5hZGRFZGdlKDAsMSk7CiAgICBnLmFkZEVkZ2UoMCwyKTsKICAgIGcuYWRkRWRnZSgxLDMpOwogICAgZy5hZGRFZGdlKDEsNCk7CiAgICBnLmFkZEVkZ2UoMiw1KTsKCiAgICBjb3V0IDw8ICJQYXJhbGxlbCBERlMgVHJhdmVyc2FsOlxuIjsKICAgIGcucGFyYWxsZWxERlMoMCk7CgogICAgcmV0dXJuIDA7Cn0=