1-
21# SOLUTION #1
3-
42class JobNode :
53 def __init__ (self , job ):
64 self .job = job
75 self .prereqs = []
86 self .visited = False
97 self .visiting = False
108
11-
129class JobGraph :
1310 def __init__ (self , jobs ):
1411 self .nodes = []
1512 self .graph = {}
1613 for job in jobs :
17- self .addNodes (job )
18-
14+ self .addNode (job )
1915
2016 def addPrereq (self , job , prereq ):
2117 jobNode = self .getNode (job )
2218 prereqNode = self .getNode (prereq )
2319 jobNode .prereqs .append (prereqNode )
2420
25-
2621 def addNode (self , job ):
2722 self .graph [job ] = JobNode (job )
2823 self .nodes .append (self .graph [job ])
2924
30-
3125 def getNode (self , job ):
3226 if job not in self .graph :
3327 self .addNode (job )
3428 return self .graph [job ]
3529
36-
37-
3830# O(v + e) time | O(v + e) space
3931def topologicalSort (jobs , deps ):
4032 jobGraph = createJobGraph (jobs , deps )
4133 return getOrderedJobs (jobGraph )
4234
43-
4435def createJobGraph (jobs , deps ):
4536 graph = JobGraph (jobs )
4637 for prereq , job in deps :
4738 graph .addPrereq (job , prereq )
4839 return graph
4940
50-
5141def getOrderedJobs (graph ):
5242 orderedJobs = []
5343 nodes = graph .nodes
@@ -58,7 +48,6 @@ def getOrderedJobs(graph):
5848 return []
5949 return orderedJobs
6050
61-
6251def depthFirstTraverse (node , orderedJobs ):
6352 if node .visited :
6453 return False
@@ -75,60 +64,46 @@ def depthFirstTraverse(node, orderedJobs):
7564 return False
7665
7766
78-
79-
80-
81-
82-
8367# SOLUTION #2
84-
8568class JobNode :
8669 def __init__ (self , job ):
8770 self .job = job
8871 self .deps = []
8972 self .numOfPrereqs = 0
9073
91-
9274class JobGraph :
9375 def __init__ (self , jobs ):
9476 self .nodes = []
9577 self .graph = {}
9678 for job in jobs :
97- self .addNodes (job )
98-
79+ self .addNode (job )
9980
10081 def addDep (self , job , dep ):
10182 jobNode = self .getNode (job )
10283 depNode = self .getNode (dep )
10384 jobNode .dep .append (depNode )
10485 depNode .numOfPrereqs += 1
10586
106-
10787 def addNode (self , job ):
10888 self .graph [job ] = JobNode (job )
10989 self .nodes .append (self .graph [job ])
11090
111-
11291 def getNode (self , job ):
11392 if job not in self .graph :
11493 self .addNode (job )
11594 return self .graph [job ]
11695
117-
118-
11996# O(v + e) time | O(v + e) space
12097def topologicalSort (jobs , deps ):
12198 jobGraph = createJobGraph (jobs , deps )
12299 return getOrderedJobs (jobGraph )
123100
124-
125101def createJobGraph (jobs , deps ):
126102 graph = JobGraph (jobs )
127103 for job , dep in deps :
128104 graph .addDep (job , dep )
129105 return graph
130106
131-
132107def getOrderedJobs (graph ):
133108 orderedJobs = []
134109 nodesWithNoPrereqs = list (filter (lambda node : node .numOfPrereqs == 0 , graph .nodes ))
@@ -139,7 +114,6 @@ def getOrderedJobs(graph):
139114 graphHasEdges = any (node .numOfPrereqs for node in graph .nodes )
140115 return [] if graphHasEdges else orderedJobs
141116
142-
143117def removeDeps (node , nodesWithNoPrereqs ):
144118 while len (node .deps ):
145119 dep = node .deps .pop ()
0 commit comments