Topological Sorting |
Topological sorting is a way of arranging the vertices of a directed acyclic graph (DAG) in a linear order, such that for every directed edge from vertex A to vertex B, A comes before B in the linear order. This is a useful algorithm for scheduling tasks that have dependencies, as it can provide an ordering of tasks that respects the dependencies between them. The implementation uses depth-first search (DFS) to traverse the graph and push the vertices onto a stack in the order they finish being visited. The resulting stack is then popped to output the vertices in the topological order. Note: The algorithm below assumes the graph is acyclic (has no cycles) as a cyclic directed graph has no topological sorting.
Time Complexity: O(m+n), where m is the number of edges and n is the number of vertices
#include <iostream>
#include <vector>
using namespace std;
vector<bool> visited;
vector<int> finished;
void DFS(vector<vector<int>> graph, int s){
if(visited[s]){
return;
}
visited[s] = true;
for(int i = 0; i<graph[s].size(); i++){
if(!visited[graph[s][i]]){
DFS(graph,graph[s][i]);
}
}
finished.push_back(s);
}
vector<int> topological_sorting(vector<vector<int>> graph){
visited.resize(graph.size(),false);
for(int i = 0; i<graph.size(); i++){
DFS(graph,i);
}
reverse(finished.begin(),finished.end());
return finished;
}
int main()
{
vector<vector<int>> graph = {{1, 3}, {2}, {}, {1, 4, 5}, {5}, {}};
vector<int> my_order = topological_sorting(graph);
vector<int> correct_order = {0,3,4,5,1,2};
if(correct_order.size()!=my_order.size()){
cout << "Wrong!" << endl;
for(int i = 0; i<my_order.size(); i++){
cout << my_order[i] << " ";
}
return 0;
}
for(int i = 0; i<my_order.size(); i++){
if(correct_order[i]!=my_order[i]){
cout << "Wrong!" << endl;
for(int i = 0; i<my_order.size(); i++){
cout << my_order[i] << " ";
}
return 0;
}
}
cout << "Success!" << endl;
}