diff --git a/c++/Topological-sort.cpp b/c++/Topological-sort.cpp new file mode 100644 index 0000000..d202bb1 --- /dev/null +++ b/c++/Topological-sort.cpp @@ -0,0 +1,69 @@ +#include +#include +#include +using namespace std; + +class Graph { + int V; + list* adj; + + void topologicalSortUtil(int v, bool visited[], stack& Stack); + +public: + Graph(int V); + void addEdge(int v, int w); + void topologicalSort(); +}; + +Graph::Graph(int V) +{ + this->V = V; + adj = new list[V]; +} + +void Graph::addEdge(int v, int w) +{ + adj[v].push_back(w); +} + +void Graph::topologicalSortUtil(int v, bool visited[], + stack& Stack) +{ + visited[v] = true; + + list::iterator i; + for (i = adj[v].begin(); i != adj[v].end(); ++i) + if (!visited[*i]) + topologicalSortUtil(*i, visited, Stack); + Stack.push(v); +} + +void Graph::topologicalSort() +{ + stack Stack; + bool* visited = new bool[V]; + for (int i = 0; i < V; i++) + visited[i] = false; + for (int i = 0; i < V; i++) + if (visited[i] == false) + topologicalSortUtil(i, visited, Stack); + + while (Stack.empty() == false) { + cout << Stack.top() << " "; + Stack.pop(); + } +} + +int main() +{ + Graph g(6); + g.addEdge(5, 2); + g.addEdge(5, 0); + g.addEdge(4, 0); + g.addEdge(4, 1); + g.addEdge(2, 3); + g.addEdge(3, 1); + g.topologicalSort(); + + return 0; +}