diff --git a/Topological sort.cpp b/Topological sort.cpp new file mode 100644 index 0000000..755d03e --- /dev/null +++ b/Topological sort.cpp @@ -0,0 +1,114 @@ +/*In DFS, we start from a vertex, we first print it and then recursively call DFS for its adjacent vertices. + In topological sorting, we use a temporary stack. We don’t print the vertex immediately, + we first recursively call topological sorting for all its adjacent vertices, then push it to a stack. +Finally, print contents of the stack. + Note that a vertex is pushed to stack only when all of its adjacent vertices (and their adjacent vertices and so on) are already in the stack. +*/ +// A C++ program to print topological +// sorting of a DAG +#include +#include +#include +using namespace std; + +// Class to represent a graph +class Graph { + // No. of vertices' + int V; + + // Pointer to an array containing adjacency listsList + list* adj; + + // A function used by topologicalSort + void topologicalSortUtil(int v, bool visited[], + stack& Stack); + +public: + // Constructor + Graph(int V); + + // function to add an edge to graph + void addEdge(int v, int w); + + // prints a Topological Sort of + // the complete graph + void topologicalSort(); +}; + +Graph::Graph(int V) +{ + this->V = V; + adj = new list[V]; +} + +void Graph::addEdge(int v, int w) +{ + // Add w to v’s list. + adj[v].push_back(w); +} + +// A recursive function used by topologicalSort +void Graph::topologicalSortUtil(int v, bool visited[], + stack& Stack) +{ + // Mark the current node as visited. + visited[v] = true; + + // Recur for all the vertices + // adjacent to this vertex + list::iterator i; + for (i = adj[v].begin(); i != adj[v].end(); ++i) + if (!visited[*i]) + topologicalSortUtil(*i, visited, Stack); + + // Push current vertex to stack + // which stores result + Stack.push(v); +} + +// The function to do Topological Sort. +// It uses recursive topologicalSortUtil() +void Graph::topologicalSort() +{ + stack Stack; + + // Mark all the vertices as not visited + bool* visited = new bool[V]; + for (int i = 0; i < V; i++) + visited[i] = false; + + // Call the recursive helper function + // to store Topological + // Sort starting from all + // vertices one by one + for (int i = 0; i < V; i++) + if (visited[i] == false) + topologicalSortUtil(i, visited, Stack); + + // Print contents of stack + while (Stack.empty() == false) { + cout << Stack.top() << " "; + Stack.pop(); + } +} + +// Driver Code +int main() +{ + // Create a graph given in the above diagram + 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); + + cout << "Following is a Topological Sort of the given " + "graph \n"; + + // Function Call + g.topologicalSort(); + + return 0; +}