with open('jobsPC_2.txt', 'r') as f:
    #with open('jobsPC.txt', 'r') as f:
    N = int(f.readline().strip())  # N is number of jobs to schedule
    # build digraph to model job sequencing: 1 src, 1 target, each job has 2 vertices (start, end)
    G = EdgeWeightedDigraph(N * 2 + 2)
    src = 2 * N
    sink = 2 * N + 1

    lines = f.read().split('\n')  # drop last line which is ''
f.close()
job = 0  # 'job' is job index
for line in lines:
    fields = line.split()  # split line on whitepace
    duration = float(fields[0])
    G.addEdge(DEdge(job, job + N,
                    duration))  # add edge betw 'start of job' and 'end of job'
    G.addEdge(DEdge(src, job, 0))
    G.addEdge(DEdge(job + N, sink, 0))
    succ = map(int, fields[1:])
    for w in succ:
        # add precedence edges
        G.addEdge(DEdge(job + N, w, 0))
    job += 1

lp = AcyclicLP(G, src)  # checks whether G is a DAG
print 'Start times:'
for i in range(N):
    print '%4d: %5.1f\n' % (i, lp.distTo(i))
print 'Finish time: %5.1f\n' % lp.distTo(sink)
from GraphLib import EdgeWeightedDigraph
from BaseClassLib import GraphBase
from DirectedEdge import DEdge 		# directed, weighted edge
from LongestPath import AcyclicLP 
from ShortestPath import AcyclicSP	

with open('tinyEWDAG.txt', 'r') as f:
	V = int(f.readline().strip())
	E = int(f.readline().strip())
	text = f.read()
f.close()

#dag = EdgeWeightedDigraph(V)
class DAG(GraphBase):
	pass
dag = DAG.graphfactory(V, directed=True, weighted=True)
lines = text.split('\n')
for line in lines[:-1]:		# last line is empty
	l = line.split()
	v = int(l[0])
	w = int(l[1])
	weight = float(l[2])
	dag.addEdge(DEdge(v, w, weight))

#find the longest path from 0 => 5
d = AcyclicLP(dag, 5)
d.distTo(0)

#find the shortest path from 0 => 5
sh = AcyclicSP(dag, 5)
sh.distTo(0)
f.close()
job = 0 												# 'job' is job index
for line in lines:
	fields = line.split() 								# split line on whitepace
	duration = float(fields[0])
	G.addEdge(DEdge(job, job + N, duration))			# add edge betw 'start of job' and 'end of job'
	G.addEdge(DEdge(src, job, 0))
	G.addEdge(DEdge(job + N, sink, 0))
	succ = map(int, fields[1:])
	for w in succ:
		# add precedence edges
		G.addEdge(DEdge(job + N, w, 0))
	job += 1

lp = AcyclicLP(G, src) 									# checks whether G is a DAG
print 'Start times:'
for i in range(N):
	print '%4d: %5.1f\n' % (i, lp.distTo(i))
print 'Finish time: %5.1f\n' % lp.distTo(sink)