拓扑排序
拓扑排序代码:
public class Topological { private Iterable<Integer> order; // topological order private int[] rank; // rank[v] = rank of vertex v in order public Topological(Digraph G) { DirectedCycle finder = new DirectedCycle(G); if (!finder.hasCycle()) { DepthFirstOrder dfs = new DepthFirstOrder(G); order = dfs.reversePost();//顶点的拓扑排序 rank = new int[G.V()]; int i = 0; for (int v : order) rank[v] = i++; } } public Topological(EdgeWeightedDigraph G) { EdgeWeightedDirectedCycle finder = new EdgeWeightedDirectedCycle(G); if (!finder.hasCycle()) { DepthFirstOrder dfs = new DepthFirstOrder(G); order = dfs.reversePost(); } } public Iterable<Integer> order() { return order; } public boolean hasOrder() { return order != null; } @Deprecated public boolean isDAG() { return hasOrder(); } public int rank(int v) { validateVertex(v); if (hasOrder()) return rank[v]; else return -1; } // throw an IllegalArgumentException unless {@code 0 <= v < V} private void validateVertex(int v) { int V = rank.length; if (v < 0 || v >= V) throw new IllegalArgumentException("vertex " + v + " is not between 0 and " + (V-1)); } public static void main(String[] args) { String filename = args[0]; String delimiter = args[1]; SymbolDigraph sg = new SymbolDigraph(filename, delimiter); Topological topological = new Topological(sg.digraph()); for (int v : topological.order()) { StdOut.println(sg.nameOf(v)); } } }