1 // A C++ program to print topological 2 // sorting of a DAG 3 #include <iostream> 4 #include <list> 5 #include <stack> 6 using namespace std; 7 8 // Class to represent a graph 9 class Graph { 10 // No. of vertices‘ 11 int V; 12 13 // Pointer to an array containing adjacency listsList 14 list<int>* adj; 15 16 // A function used by topologicalSort 17 void topologicalSortUtil(int v, bool visited[], 18 stack<int>& Stack); 19 20 public: 21 // Constructor 22 Graph(int V); 23 24 // function to add an edge to graph 25 void addEdge(int v, int w); 26 27 // prints a Topological Sort of 28 // the complete graph 29 void topologicalSort(); 30 }; 31 32 Graph::Graph(int V) 33 { 34 this->V = V; 35 adj = new list<int>[V]; 36 } 37 38 void Graph::addEdge(int v, int w) 39 { 40 // Add w to v’s list. 41 adj[v].push_back(w); 42 } 43 44 // A recursive function used by topologicalSort 45 void Graph::topologicalSortUtil(int v, bool visited[], 46 stack<int>& Stack) 47 { 48 // Mark the current node as visited. 49 visited[v] = true; 50 51 // Recur for all the vertices 52 // adjacent to this vertex 53 list<int>::iterator i; 54 for (i = adj[v].begin(); i != adj[v].end(); ++i) 55 if (!visited[*i]) 56 topologicalSortUtil(*i, visited, Stack); 57 58 // Push current vertex to stack 59 // which stores result 60 Stack.push(v); 61 } 62 63 // The function to do Topological Sort. 64 // It uses recursive topologicalSortUtil() 65 void Graph::topologicalSort() 66 { 67 stack<int> Stack; 68 69 // Mark all the vertices as not visited 70 bool* visited = new bool[V]; 71 for (int i = 0; i < V; i++) 72 visited[i] = false; 73 74 // Call the recursive helper function 75 // to store Topological 76 // Sort starting from all 77 // vertices one by one 78 for (int i = 0; i < V; i++) 79 if (visited[i] == false) 80 topologicalSortUtil(i, visited, Stack); 81 82 // Print contents of stack 83 while (Stack.empty() == false) { 84 cout << Stack.top() << " "; 85 Stack.pop(); 86 } 87 } 88 89 // Driver Code 90 int main() 91 { 92 // Create a graph given in the above diagram 93 Graph g(6); 94 g.addEdge(5, 2); 95 g.addEdge(5, 0); 96 g.addEdge(4, 0); 97 g.addEdge(4, 1); 98 g.addEdge(2, 3); 99 g.addEdge(3, 1); 100 101 cout << "Following is a Topological Sort of the given " 102 "graph \n"; 103 104 // Function Call 105 g.topologicalSort(); 106 107 return 0; 108 }
原文:https://www.cnblogs.com/hulianxingkong/p/15201733.html