Hello, programmers! In this tutorial, we will learn Java program for Topological sorting using Kahn’s algorithm.
Topological Sorting: The linear ordering of vertices in a Directed Acyclic Graph(DAG) with V vertices and E edges such that every directed edge from vertex u->v, where vertex u comes before v in the order.
In-degree: The number of incoming edges is in-degree for a vertex.
Out-degree: The number of outgoing edges is out-degree for a vertex.
Zero in-degree: The number of incoming edges is zero for a vertex.
Kahn’s Algorithm for Topological Sorting in Java
Let us consider a Directed Acyclic Graph with V vertices and E edges.
Example:
Here, V = 4, E = {{0,3},{2,3},{3,1},{2,1}}

Algorithm:
- First, find the in-degree of each vertex in the graph.
- Then, find the edges with zero in-degree. Update them in the queue.
- If the queue is not empty, then remove a node from the queue and for each outgoing edge of the removed node decrease the in-degree of the destination node by 1.
- If the queue is empty then that indicates that there are still some nodes in the graph i.e., the graph contains a cycle and it cannot be topologically sorted.
- The nodes in the queue represents the topological order of the graph.
import java.util.*;
public class CodeSpeedy {
public static List<Integer> topoSort(List<List<Integer> > u, int v) {
int[] indegree = new int[v];
for (int i=0;i<v;i++) {
for (int vxt : u.get(i)) {
indegree[vxt]++;
}
}
Queue<Integer> q = new LinkedList<>();
for (int i = 0; i < v; i++) {
if (indegree[i] == 0) {
q.add(i);
}
}
List<Integer> result = new ArrayList<>();
while (!q.isEmpty()) {
int node = q.poll();
result.add(node);
for (int adj : u.get(node)) {
indegree[adj]--;
if (indegree[adj] == 0) q.add(adj);
}
}
if (result.size() != v) {
System.out.println("Graph is having cycle!");
return new ArrayList<>();
}
return result;
}
public static void main(String[] args) {
int n = 4;
List<List<Integer> > edges = Arrays.asList(
Arrays.asList(0, 3), Arrays.asList(3, 1),
Arrays.asList(2, 3), Arrays.asList(2, 1));
List<List<Integer> > u = new ArrayList<>();
for (int i = 0; i < n; i++) {
u.add(new ArrayList<>());
}
for (List<Integer> edge : edges) {
u.get(edge.get(0)).add(edge.get(1));
}
System.out.print("Topological sorting of the graph: ");
List<Integer> result = topoSort(u, n);
for (int vxt : result) {
System.out.print(" "+vxt);
}
}
}
Output:
Topological sorting of the graph: 0 2 3 1