Given a Directed Acyclic Graph (DAG), print it in topological order using topological sort algorithm. If the graph has more than one topological ordering, output any of them. Assume valid Directed Acyclic Graph (DAG).

A Topological sort or Topological ordering of a directed graph is a linear ordering of its vertices such that for every directed edge uv from vertex u to vertex v, u comes before v in the ordering. A topological ordering is possible if and only if the graph has no directed cycles, i.e. if the graph is DAG.

 
For example, consider the following graph:

Topological Order – Step 2

The graph has many valid topological ordering of vertices like,

5   7   3   1   0   2   6   4
3   5   7   0   1   2   6   4
5   7   3   0   1   4   6   2
7   5   1   3   4   0   6   2
5   7   1   2   3   0   6   4
3   7   0   5   1   4   2   6

etc.

Note that for every directed edge u —> v, u comes before v in the ordering.

 
Topological Order – Step 1

Practice this problem

We can use Depth–first search (DFS) to implement topological sort algorithm. The idea is to order the vertices in order of their decreasing departure time of vertices in DFS, and we will get our desired topological sort.

How does it work?

We have already discussed the relationship between all four types of edges involved in the DFS in the previous post. Following is the relationship we have seen between the departure time for different types of edges involved in a DFS of the directed graph:

Tree edge (u, v): departure[u] > departure[v]
Back edge (u, v): departure[u] < departure[v]
Forward edge (u, v): departure[u] > departure[v]
Cross edge (u, v): departure[u] > departure[v]

As we can see that for a tree edge, forward edge, or cross edge (u, v), departure[u] is more than departure[v]. But only for the back edge, relationship departure[u] < departure[v] is true. So, it is guaranteed that if an edge (u, v) has departure[u] > departure[v], it’s not a back-edge.

 
We know that in a DAG, no back-edge is present. So if we order the vertices in order of their decreasing departure time, we will get the topological order of the graph (every edge going from left to right).

Types of edges involved in DFS and relation between them

Following is the C++, Java, and Python implementation of the topological sort algorithm:

C++


Download  Run Code

Output:

7 5 3 1 4 2 0 6

Java


Download  Run Code

Output:

7 5 3 1 4 2 0 6

Python


Download  Run Code

Output:

7 5 3 1 4 2 0 6

The time complexity of the above implementation is O(V + E), where V and E are the total number of vertices and edges in the graph, respectively.

 
Also See:

Kahn’s Topological Sort Algorithm

 
References:

1. Topological sorting – Wikipedia

2. Dr. Naveen Garg, IIT–D (Lecture – 29 DFS in Directed Graphs)