This Java program demonstrates how to perform a topological sort on a directed acyclic graph (DAG). Topological sorting is only possible if the graph has no cycles and is directed. The sort is useful for tasks such as determining the order of compilation tasks, project scheduling, and more.
Java Code
import java.util.*; class Graph { private int V; // No. of vertices private LinkedList<Integer> adj[]; // Adjacency List as an array of linked lists // Constructor Graph(int v) { V = v; adj = new LinkedList[v]; for (int i=0; i<v; ++i) adj[i] = new LinkedList(); } // Function to add an edge into the graph void addEdge(int v, int w) { adj[v].add(w); } // A recursive function used by topologicalSort void topologicalSortUtil(int v, boolean visited[], Stack<Integer> stack) { // Mark the current node as visited visited[v] = true; Integer i; // Recur for all the vertices adjacent to this vertex Iterator<Integer> it = adj[v].iterator(); while (it.hasNext()) { i = it.next(); if (!visited[i]) topologicalSortUtil(i, visited, stack); } // Push current vertex to stack which stores result stack.push(v); } // The function to do Topological Sort. It uses recursive topologicalSortUtil() void topologicalSort() { Stack<Integer> stack = new Stack<>(); // Mark all the vertices as not visited boolean visited[] = new boolean[V]; for (int i = 0; i < V; i++) visited[i] = false; // Call the recursive helper function to store Topological Sort starting from all vertices one by one for (int i = 0; i < V; i++) if (visited[i] == false) topologicalSortUtil(i, visited, stack); // Print contents of stack while (stack.empty()==false) System.out.print(stack.pop() + " "); } } public class TopologicalSort { public static void main(String[] args) { // Create a graph given in the above diagram Graph g = new Graph(6); g.addEdge(5, 2); g.addEdge(5, 0); g.addEdge(4, 0); g.addEdge(4, 1); g.addEdge(2, 3); g.addEdge(3, 1); System.out.println("Following is a Topological sort of the given graph"); g.topologicalSort(); } }
Explanation of the Code
The program defines a Graph
class which includes:
- Graph Structure: Uses adjacency lists to represent the graph. Each vertex has a list of edges that point from it to other vertices.
- addEdge: Method to add an edge to the graph.
- topologicalSortUtil: A recursive helper function that performs a depth-first search (DFS) and pushes each vertex onto a stack after all vertices it points to have been processed (indicating that all prerequisites are met).
- topologicalSort: Initializes necessary data structures and processes all vertices to build the topological sort, then prints the sorted order.
This implementation of topological sorting in Java is efficient and clear, making it a practical tool for scheduling and ordering tasks in computer science and software engineering fields.