public ArrayList<DirectedGraphNode> topSort(ArrayList<DirectedGraphNode> graph) {
ArrayList<DirectedGraphNode> res = new ArrayList<DirectedGraphNode>();
HashMap<DirectedGraphNode, Integer> map = new HashMap<>();
for (DirectedGraphNode node : graph) {
for (DirectedGraphNode neig : node.neighbors) {
if (map.containsKey(neig)) {
map.put(neig, map.get(neig) + 1);
}
else {
map.put(neig, 1);}
}
}
Queue<DirectedGraphNode> q = new LinkedList<DirectedGraphNode>();
for (DirectedGraphNode node : graph) {
if (!map.containsKey(node)) {
q.add(node);
res.add(node);
}
}
while (!q.isEmpty()) {
DirectedGraphNode tmp = q.poll();
for (DirectedGraphNode neig : tmp.neighbors) {
map.put(neig, map.get(neig) - 1);
if (map.get(neig) == 0) {
q.add(neig);
res.add(neig);
}
}
}
return res;
}