From cb0c3d651ec7f3f0c0dc8ffb9768ec1e86f5d2d3 Mon Sep 17 00:00:00 2001 From: Brendan Chen Date: Mon, 7 Sep 2026 15:50:59 -0700 Subject: [PATCH] Revert "Remove solution; revert later after going over the topic" This reverts commit 8d50900eaa999e1cd7c6eb2eca5b6527d9a413e8. --- .../2026.08.27/topological_sort_solution.py | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 notes-and-examples/2026.08.27/topological_sort_solution.py diff --git a/notes-and-examples/2026.08.27/topological_sort_solution.py b/notes-and-examples/2026.08.27/topological_sort_solution.py new file mode 100644 index 0000000..e5b21c7 --- /dev/null +++ b/notes-and-examples/2026.08.27/topological_sort_solution.py @@ -0,0 +1,47 @@ +from collections import deque + +# This is a solution which uses DFS to trace the paths; there +# are other solutions as well + +classes = { + 'CPSC 230': {'CPSC 231'}, + 'CPSC 231': {'CPSC 350', 'CPSC 330'}, + 'CPSC 350': {'CPSC 380', 'CPSC 408', 'CPSC 406'}, + 'CPSC 330': {'CPSC 351'}, + 'CPSC 351': set(), + 'ENGR 101': set(), + 'CPSC 380': set(), + 'CPSC 406': set(), + 'CPSC 408': set() +} + + +def topological_sort(adjacency_list: dict[str, set[str]]): + result = deque() + visited = set() + + def dfs(current: str, visited_in_traversal=None): + if visited_in_traversal is None: + visited_in_traversal = set() + if current in visited: + return + if current in visited_in_traversal: + raise ValueError("Graph has a cycle") + + visited_in_traversal.add(current) + + for neighbor in adjacency_list[current]: + dfs(neighbor, visited_in_traversal) + + # to trace the reverse path, use .append + result.appendleft(current) + visited.add(current) + + for node in adjacency_list.keys(): + if node not in visited: + dfs(node) + + return result + + +print(topological_sort(classes))