package com.anuragkapur.ds.graph;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/**
* Running time: O(V+E), where V is number of vertices and E is number of edges
*
* @author anuragkapur
*/
public class TopologicalSort {
private List<Vertex> sortedVertices = new ArrayList<>();
private Set<Vertex> visited = new HashSet<>();
public List<Vertex> computeTopologicalSort(Graph graph) {
for (Vertex u : graph.getVertices()) {
if (visited.add(u)) {
// unexplored
dfs(graph, u);
sortedVertices.add(u);
}
}
return sortedVertices;
}
public void dfs(Graph graph, Vertex u) {
for(Edge edge : graph.getEdgesFrom(u)) {
if (visited.add(edge.getVertex2())) {
dfs(graph, edge.getVertex2());
sortedVertices.add(edge.getVertex2());
}
}
}
}