/** * Reads the precedence constraints from standard input * and prints a feasible schedule to standard output. * * @param args the command-line arguments */ public static void main(String[] args) { // number of jobs int n = StdIn.readInt(); // source and sink int source = 2*n; int sink = 2*n + 1; // build network EdgeWeightedDigraph G = new EdgeWeightedDigraph(2*n + 2); for (int i = 0; i < n; i++) { double duration = StdIn.readDouble(); G.addEdge(new DirectedEdge(source, i, 0.0)); G.addEdge(new DirectedEdge(i+n, sink, 0.0)); G.addEdge(new DirectedEdge(i, i+n, duration)); // precedence constraints int m = StdIn.readInt(); for (int j = 0; j < m; j++) { int precedent = StdIn.readInt(); G.addEdge(new DirectedEdge(n+i, precedent, 0.0)); } } // compute longest path AcyclicLP lp = new AcyclicLP(G, source); // print results StdOut.println(" job start finish"); StdOut.println("--------------------"); for (int i = 0; i < n; i++) { StdOut.printf("%4d %7.1f %7.1f\n", i, lp.distTo(i), lp.distTo(i+n)); } StdOut.printf("Finish time: %7.1f\n", lp.distTo(sink)); }
/** * Unit tests the {@code AcyclicLP} data type. * * @param args the command-line arguments */ public static void main(String[] args) { In in = new In(args[0]); int s = Integer.parseInt(args[1]); EdgeWeightedDigraph G = new EdgeWeightedDigraph(in); AcyclicLP lp = new AcyclicLP(G, s); for (int v = 0; v < G.V(); v++) { if (lp.hasPathTo(v)) { StdOut.printf("%d to %d (%.2f) ", s, v, lp.distTo(v)); for (DirectedEdge e : lp.pathTo(v)) { StdOut.print(e + " "); } StdOut.println(); } else { StdOut.printf("%d to %d no path\n", s, v); } } }