#include <iostream>
#include <vector>
#include <queue>
#include <omp.h>
using namespace std;
class Graph {
int V;
vector<vector<int>> adj;
public:
Graph(int V) : V(V) {
adj.resize(V);
}
void addEdge(int u, int v) {
adj[u].push_back(v);
}
void bfs(int start) {
vector<bool> visited(V, false);
queue<int> q;
q.push(start);
visited[start] = true;
while (!q.empty()) {
int current;
#pragma omp parallel shared(q, visited) private(current)
{
#pragma omp critical
{
current = q.front();
q.pop();
}
#pragma omp for
for (int i = 0; i < adj[current].size(); ++i) {
int neighbor = adj[current][i];
if (!visited[neighbor]) {
#pragma omp critical
{
visited[neighbor] = true;
q.push(neighbor);
}
}
}
}
}
}
void dfsUtil(int v, vector<bool>& visited) {
visited[v] = true;
cout << v << " ";
#pragma omp parallel for
for (int i = 0; i < adj[v].size(); ++i) {
int u = adj[v][i];
if (!visited[u]) {
dfsUtil(u, visited);
}
}
}
void dfs(int start) {
vector<bool> visited(V, false);
dfsUtil(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, 4);
g.addEdge(3, 5);
g.addEdge(4, 5);
cout << "BFS starting from vertex 0: ";
g.bfs(0);
cout << endl;
cout << "DFS starting from vertex 0: ";
g.dfs(0);
cout << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDxvbXAuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBHcmFwaCB7CiAgICBpbnQgVjsKICAgIHZlY3Rvcjx2ZWN0b3I8aW50Pj4gYWRqOwoKcHVibGljOgogICAgR3JhcGgoaW50IFYpIDogVihWKSB7CiAgICAgICAgYWRqLnJlc2l6ZShWKTsKICAgIH0KCiAgICB2b2lkIGFkZEVkZ2UoaW50IHUsIGludCB2KSB7CiAgICAgICAgYWRqW3VdLnB1c2hfYmFjayh2KTsKICAgIH0KCiAgICB2b2lkIGJmcyhpbnQgc3RhcnQpIHsKICAgICAgICB2ZWN0b3I8Ym9vbD4gdmlzaXRlZChWLCBmYWxzZSk7CiAgICAgICAgcXVldWU8aW50PiBxOwoKICAgICAgICBxLnB1c2goc3RhcnQpOwogICAgICAgIHZpc2l0ZWRbc3RhcnRdID0gdHJ1ZTsKCiAgICAgICAgd2hpbGUgKCFxLmVtcHR5KCkpIHsKICAgICAgICAgICAgaW50IGN1cnJlbnQ7CgogICAgICAgICAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQocSwgdmlzaXRlZCkgcHJpdmF0ZShjdXJyZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBxLmZyb250KCk7CiAgICAgICAgICAgICAgICAgICAgcS5wb3AoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjcHJhZ21hIG9tcCBmb3IKICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWRqW2N1cnJlbnRdLnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgICAgICAgICAgaW50IG5laWdoYm9yID0gYWRqW2N1cnJlbnRdW2ldOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIXZpc2l0ZWRbbmVpZ2hib3JdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpc2l0ZWRbbmVpZ2hib3JdID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEucHVzaChuZWlnaGJvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgdm9pZCBkZnNVdGlsKGludCB2LCB2ZWN0b3I8Ym9vbD4mIHZpc2l0ZWQpIHsKICAgICAgICB2aXNpdGVkW3ZdID0gdHJ1ZTsKICAgICAgICBjb3V0IDw8IHYgPDwgIiAiOwoKICAgICAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3IKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFkalt2XS5zaXplKCk7ICsraSkgewogICAgICAgICAgICBpbnQgdSA9IGFkalt2XVtpXTsKICAgICAgICAgICAgaWYgKCF2aXNpdGVkW3VdKSB7CiAgICAgICAgICAgICAgICBkZnNVdGlsKHUsIHZpc2l0ZWQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHZvaWQgZGZzKGludCBzdGFydCkgewogICAgICAgIHZlY3Rvcjxib29sPiB2aXNpdGVkKFYsIGZhbHNlKTsKICAgICAgICBkZnNVdGlsKHN0YXJ0LCB2aXNpdGVkKTsKICAgIH0KfTsKCmludCBtYWluKCkgewogICAgR3JhcGggZyg2KTsKICAgIGcuYWRkRWRnZSgwLCAxKTsKICAgIGcuYWRkRWRnZSgwLCAyKTsKICAgIGcuYWRkRWRnZSgxLCAzKTsKICAgIGcuYWRkRWRnZSgxLCA0KTsKICAgIGcuYWRkRWRnZSgyLCA0KTsKICAgIGcuYWRkRWRnZSgzLCA1KTsKICAgIGcuYWRkRWRnZSg0LCA1KTsKCiAgICBjb3V0IDw8ICJCRlMgc3RhcnRpbmcgZnJvbSB2ZXJ0ZXggMDogIjsKICAgIGcuYmZzKDApOwogICAgY291dCA8PCBlbmRsOwoKICAgIGNvdXQgPDwgIkRGUyBzdGFydGluZyBmcm9tIHZlcnRleCAwOiAiOwogICAgZy5kZnMoMCk7CiAgICBjb3V0IDw8IGVuZGw7CgogICAgcmV0dXJuIDA7Cn0K