from collections import deque def find_compilation_order(dependencies): sorted_order = [] graph = {} inDegree = {} for x in dependencies: parent, child = x[1], x[0] graph[parent], graph[child] = [], [] inDegree[parent], inDegree[child] = 0, 0 if len(graph) <= 0: return sorted_order for dependency in dependencies: parent, child = dependency[1], dependency[0] graph[parent].append(child) inDegree[child] += 1 sources = deque() for key in inDegree: if inDegree[key] == 0: sources.append(key) while sources: vertex = sources.popleft() sorted_order.append(vertex) for child in graph[vertex]: inDegree[child] -= 1 if inDegree[child] == 0: sources.append(child) if len(sorted_order) != len(graph): return [] return sorted_order # Driver code def main(): dependencies = [[['B', 'A'], ['C', 'A'], ['D', 'C'], ['E', 'D'], ['E', 'B']], [['B', 'A'], ['C', 'A'], ['D', 'B'], ['E', 'B'], ['E', 'D'], ['E', 'C'], ['F', 'D'], ['F', 'E'], ['F', 'C']], [['A', 'B'], ['B', 'A']], [['B', 'C'], ['C', 'A'], ['A', 'F']], [['C', 'C']]] for i in range(len(dependencies)): print(i + 1, ".\tdependencies: ", dependencies[i], sep = "") print("\tCompilation Order: ", find_compilation_order(dependencies[i]), sep = "") print("-"*100, "\n", sep ="") if __name__ == "__main__": main()