1. 程式人生 > 其它 >複雜成樹(不是遞迴方式)

複雜成樹(不是遞迴方式)

拓撲排序程式碼:

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)); } } }