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
System.out.println(" job start finish");
System.out.println("--------------------");
for (int i = 0; i < N; i++) {
System.out.printf("%4d %7.1f %7.1f\n", i, lp.distTo(i), lp.distTo(i+N));
}