1
+ def create_graph (projects , dependencies ):
2
+ project_graph = {}
3
+ for project in projects :
4
+ project_graph [project ] = []
5
+ for pairs in dependencies :
6
+ project_graph [pairs [0 ]].extend (pairs [1 ])
7
+ return project_graph
8
+ graph = create_graph (['A' , 'B' , 'C' , 'D' , 'E' , 'F' ], [('A' ,'D' ), ('F' , 'B' ), ('B' ,'D' ), ('F' ,'A' ), ('D' ,'C' )])
9
+ # print(graph)
10
+
11
+ def get_projects_with_dependencies (graph ):
12
+ projects_with_depen = set ()
13
+ for project in graph :
14
+ # addin values from dictionaty because values are dependednt of key
15
+ projects_with_depen = projects_with_depen .union (set (graph [project ]))
16
+
17
+ return projects_with_depen
18
+
19
+ dependents = get_projects_with_dependencies (graph )
20
+ # print(dependents)
21
+
22
+ def get_projects_wo_dependencies (projects_with , graph ):
23
+ projects_wo_dependencies = set ()
24
+ for project in graph :
25
+ if not project in projects_with :
26
+ projects_wo_dependencies .add (project )
27
+ return projects_wo_dependencies
28
+ notDependents = get_projects_wo_dependencies (dependents , graph )
29
+ # print(notDependents)
30
+
31
+ def find_build_order (projects , dependencies ):
32
+ build_order = []
33
+ project_graph = create_graph (projects , dependencies )
34
+ while project_graph :
35
+ print (project_graph )
36
+ projects_with_depen = get_projects_with_dependencies (project_graph )
37
+ projects_wo_depen = get_projects_wo_dependencies (projects_with_depen , project_graph )
38
+ print (projects_wo_depen )
39
+ if len (projects_wo_depen ) == 0 and project_graph :
40
+ raise ValueError ('There is a cycle in the build order' )
41
+ for independent_project in projects_wo_depen :
42
+ build_order .append (independent_project )
43
+ del project_graph [independent_project ]
44
+ return build_order
45
+
46
+ print (find_build_order (['A' , 'B' , 'C' , 'D' , 'E' , 'F' ], [('A' ,'D' ), ('F' , 'B' ), ('B' ,'D' ), ('F' ,'A' ), ('D' ,'C' )]))
0 commit comments