#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 (V) {}
void addEdge(int v, int w) {
adj[v].push_back(w);
}
void parallelDFS(int startVertex) {
vector<bool> visited(V, false);
parallelDFSUtil(startVertex, visited );
}
void parallelDFSUtil (int v, vector<bool>& visited) {
visited[V] = true;
cout<< v << "";
for (int i = 0; i<adj[v].size(); ++i) {
int n = adj[v][i];
if (!visited[n])
parallelDFSUtil(n, visited);
}
}
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 << " ";
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() {
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);
cout<< "depth first search (dfs): ";
g.parallelDFS(0);
cout<< endl;
cout<< "Breadth First Search (BFS): ";
g.parallelBFS(0);
cout<< endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZTx2ZWN0b3I+CiNpbmNsdWRlPHF1ZXVlPgojaW5jbHVkZTxvbXAuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNsYXNzIEdyYXBoIHsKICAgIGludCBWOwogICAgdmVjdG9yPHZlY3RvcjxpbnQ+PiBhZGo7CiAKcHVibGljOgogR3JhcGgoaW50IFYpIDogVihWKSwgYWRqIChWKSB7fQogdm9pZCBhZGRFZGdlKGludCB2LCBpbnQgdykgewogICAgIGFkalt2XS5wdXNoX2JhY2sodyk7CiB9CiAKIHZvaWQgcGFyYWxsZWxERlMoaW50IHN0YXJ0VmVydGV4KSB7CiAgICAgdmVjdG9yPGJvb2w+IHZpc2l0ZWQoViwgZmFsc2UpOwogICAgIHBhcmFsbGVsREZTVXRpbChzdGFydFZlcnRleCwgdmlzaXRlZCApOwogICAgIAogfQogdm9pZCBwYXJhbGxlbERGU1V0aWwgKGludCB2LCB2ZWN0b3I8Ym9vbD4mIHZpc2l0ZWQpIHsKICAgICB2aXNpdGVkW1ZdID0gdHJ1ZTsKICAgICBjb3V0PDwgdiA8PCAiIjsKICAgICAKICAgICBmb3IgKGludCBpID0gMDsgaTxhZGpbdl0uc2l6ZSgpOyArK2kpIHsKICAgICAgICAgaW50IG4gPSBhZGpbdl1baV07CiAgICAgICAgIGlmICghdmlzaXRlZFtuXSkKICAgICAgICAgcGFyYWxsZWxERlNVdGlsKG4sIHZpc2l0ZWQpOwogICAgIH0KIH0KCnZvaWQgcGFyYWxsZWxCRlMoaW50IHN0YXJ0VmVydGV4KSB7CiAgICB2ZWN0b3I8Ym9vbD4gdmlzaXRlZChWLCBmYWxzZSk7CiAgICBxdWV1ZTxpbnQ+IHE7CiAgICB2aXNpdGVkW3N0YXJ0VmVydGV4XSA9IHRydWU7CiAgICBxLnB1c2goc3RhcnRWZXJ0ZXgpOwogICAgCiAgICB3aGlsZSAoIXEuZW1wdHkoKSkgewogICAgICAgIGludCB2ID0gcS5mcm9udCgpOwogICAgICAgIHEucG9wKCk7CiAgICAgICAgY291dDw8IHYgPDwgIiAiOwogICAgICAgIAogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWRqW3ZdLnNpemUoKTsgKytpKSB7CiAgICAgICAgICAgIGludCBuID0gYWRqW3ZdW2ldOwogICAgICAgICAgICBpZiAoIXZpc2l0ZWRbbl0pIHsKICAgICAgICAgICAgICAgIHZpc2l0ZWRbbl0gPSB0cnVlOwogICAgICAgICAgICAgICAgcS5wdXNoKG4pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogIH0KfTsKaW50IG1haW4oKSB7CiAgICBHcmFwaCBnKDcpOwogICAgZy5hZGRFZGdlKDAsMSk7CiAgICBnLmFkZEVkZ2UoMCwyKTsKICAgIGcuYWRkRWRnZSgxLDMpOwogICAgZy5hZGRFZGdlKDEsNCk7CiAgICBnLmFkZEVkZ2UoMiw1KTsKICAgIGcuYWRkRWRnZSgyLDYpOwogICAgCiAgICBjb3V0PDwgImRlcHRoIGZpcnN0IHNlYXJjaCAoZGZzKTogIjsKICAgIGcucGFyYWxsZWxERlMoMCk7CiAgICBjb3V0PDwgZW5kbDsKICAgIAogICAgY291dDw8ICJCcmVhZHRoIEZpcnN0IFNlYXJjaCAoQkZTKTogIjsKICAgIGcucGFyYWxsZWxCRlMoMCk7CiAgICBjb3V0PDwgZW5kbDsKICAgIAogICAgcmV0dXJuIDA7CiAgICAKfQ==