package graph;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
class PostOrder<V> {
private final Graph<V> g;
private final HashSet<V> visited;
private final LinkedList<V> list;
PostOrder(Graph<V> g) {
this.g = g;
this.visited = new HashSet<V>();
this.list = new LinkedList<V>();
for (V v : this.g.vertices())
dfs(v);
}
void dfs(V v) {
if (this.visited.contains(v)) return;
this.visited.add(v);
for (V w : this.g.successors(v))
dfs(w);
this.list.addFirst(v);
}
List<V> order() {
return this.list;
}
}
class TestPostOrder {
public static void main(String[] args) {
Graph<Integer> g = new Graph<Integer>();
int[][] edges = new int[][] { {0,3}, {1,0}, {1,4}, {2,4}, {2, 5},
{3,1}, {4,3} };
for (int v = 0; v <= 5; v++)
g.addVertex(v);
for (int[] e: edges)
g.addEdge(e[0], e[1]);
PostOrder<Integer> po = new PostOrder<>(g);
System.out.println(po.order());
}
}