Topological Sort
Problem Statement
You’re a task sequencer ordering nodes in a directed acyclic graph (DAG) so that for every edge u→v, u comes before v. Return a valid topological order. This medium-level DFS/BFS challenge is a dependency roadmap—line ‘em up!
Example
Input: V = 4, edges = [[0,1],[0,2],[1,3],[2,3]]
Graph:
0→1 | \ v v 2→3
Output: [0,1,2,3] or [0,2,1,3]
Input: V = 2, edges = [[1,0]]
Output: [1,0]
Code
Java
Python
JavaScript
class Solution {
public int[] topologicalSort(int V, int[][] edges) {
List> graph = new ArrayList<>();
for (int i = 0; i < V; i++) graph.add(new ArrayList<>());
for (int[] edge : edges) graph.get(edge[0]).add(edge[1]);
Stack stack = new Stack<>();
boolean[] visited = new boolean[V];
for (int i = 0; i < V; i++) {
if (!visited[i]) dfs(graph, i, visited, stack);
}
int[] result = new int[V];
for (int i = 0; i < V; i++) result[i] = stack.pop();
return result;
}
private void dfs(List> graph, int node, boolean[] visited, Stack stack) {
visited[node] = true;
for (int neighbor : graph.get(node)) {
if (!visited[neighbor]) dfs(graph, neighbor, visited, stack);
}
stack.push(node);
}
}
from collections import defaultdict
def topological_sort(V, edges):
graph = defaultdict(list)
for u, v in edges:
graph[u].append(v)
visited = [False] * V
stack = []
def dfs(node):
visited[node] = True
for neighbor in graph[node]:
if not visited[neighbor]:
dfs(neighbor)
stack.append(node)
for i in range(V):
if not visited[i]:
dfs(i)
return stack[::-1] # Reverse to get order
function topologicalSort(V, edges) {
let graph = Array(V).fill().map(() => []);
for (let [u, v] of edges) graph[u].push(v);
let visited = new Array(V).fill(false);
let stack = [];
function dfs(node) {
visited[node] = true;
for (let neighbor of graph[node]) {
if (!visited[neighbor]) dfs(neighbor);
}
stack.push(node);
}
for (let i = 0; i < V; i++) {
if (!visited[i]) dfs(i);
}
return stack.reverse();
}
Explanation
- DFS Insight: Post-order DFS; nodes added after all dependents—reverse for topo order.
- Flow: Build graph, DFS to stack nodes after exploring children, reverse stack.
- Example Walkthrough: [0,1],[1,2] → DFS: 0→1→2, stack=[2,1,0], reverse=[0,1,2].
- BFS Alt: Kahn’s algorithm—process nodes with in-degree 0, remove edges.
- Assumption: Input is DAG; cycles would require separate check.
Note
Time complexity: O(V + E), Space complexity: O(V + E). A topological triumph—ordered and outstanding!
