Topological sorting is an ordering of the vertices of a directed graph such that if there is an edge a->b between vertices a and b, then a appears before b in the ordering. Consider the graph below: image

One possible ordering is [4,1,5,2,3,6] image

For a directed graph to have a topological ordering, it should not contain any cycle.

We can make use of DFS traversal to both check if the directed graph contains a cycle and, if doesn’t, to construct a topological sort.

Pseudo code for topological sort:

DFS(graph,u)
{
# state[u] = 1 => u has not been processed yet.
# state[u] = 2 => u is under processing.
# state[u] = 3 => u has been processed earlier.
	if(state[u]==3):
		return ;
	else if(state[u] = 2):
		cycle = 1;
		return ;
	else state[u] = 2;
	for every neighbour v of u:
		DFS(graph,v);
	
	state[u] = 3; # mark it processed.
	Stack.push(u);
}

topologicalSort(graph)
{
	ordering = []
	state[V] = {1};
	cycle = 0;
	stack Stack;
	for every node u in graph:
		DFS(graph,u);
		
	if cycle == 1:
		return ordering;
	
	while Stack is not Empty:
		ordering.add(Stack.top());
		Stack.pop();
	
	return ordering;
}

References: GeeksforGeeks