#include <vector>
#include <list>
#include <iostream>
struct Graph
{
int V;
std::vector<std::list<int>> network;
Graph(int V);
void addEdge(int s, int v);
void performDFS(int s);
};
Graph::Graph(int V)
{
this->V = V;
network.resize(V);
}
void Graph::addEdge(int s, int v)
{
network[s].push_back(v);
}
void Graph::performDFS(int s)
{
std::list<int> Stack;
Stack.push_back(s);
std::vector<bool>visited;
visited.resize(V, false);
while(!Stack.empty())
{
int v = Stack.back();
Stack.pop_back();
if (visited[v])
{
continue;
}
visited[v] = true;
std::cout<< v <<" ";
for(
std::list<int>::reverse_iterator rit=network[v].rbegin();
rit!=network[v].rend();
++rit
)
{
if(!visited[*rit])
{
Stack.push_back(*rit);
}
}
}
}
int main()
{
Graph g(4);
g.addEdge(0, 1);
g.addEdge(0, 2);
g.addEdge(1, 2);
g.addEdge(2, 0);
g.addEdge(2, 3);
g.addEdge(3, 3);
g.performDFS(1);
}