topological sort
DFS
public int[] getTopoOrder(Map graph)
{
Set discovered = new HashSet<>();
Set visited = new LinkedHashSet<>();
for (Integer node : graph.keySet())
{
if (!discoverd.contains(node))
{
if (!topoSort(graph, node, discovered, visited))
{ // a cycle is detected....error handling
}
}
}
return visited.stream().reverse().collect( Collectors.toList();
int[] topoOrder = new int[visited.size()];
int pos = topoOrder.length - 1;
for (Integer node : visited)
{
topoOrder[pos] = node;
pos--;
}
return topoOrder;
}
// @return whether a cycle is detected
private boolean topoSort(Map graph, Integer startNode, Set discovered, Set visited)
{
discovered.add(startNode);
for (Integer neighbor : graph.get(startNode))
{
if (!discovered.contains(neighbor))
{
if (topoSort(graph, neighbor, discovered, visited))
{
return true;
}
}
else if (discovered.contains(neighbor)
&& !visited.contains(neighbor))
{
return true;
}
else
{
// already visited, do nothing
;
}
}
visited.add(startNode);
return false;
}BFS
Last updated