|
14 | 14 | }
|
15 | 15 | vertices: list[str] = ["a", "b", "c", "d", "e"]
|
16 | 16 |
|
| 17 | +class Topo: |
| 18 | + def topo_sort(self): |
| 19 | + visited = set() |
| 20 | + stack = [] |
| 21 | + def dfs(node): |
| 22 | + visited.add(node) |
17 | 23 |
|
18 |
| -def topological_sort(start: str, visited: list[str], sort: list[str]) -> list[str]: |
19 |
| - """Perform topological sort on a directed acyclic graph.""" |
20 |
| - current = start |
21 |
| - # add current to visited |
22 |
| - visited.append(current) |
23 |
| - neighbors = edges[current] |
24 |
| - for neighbor in neighbors: |
25 |
| - # if neighbor not in visited, visit |
26 |
| - if neighbor not in visited: |
27 |
| - sort = topological_sort(neighbor, visited, sort) |
28 |
| - # if all neighbors visited add current to sort |
29 |
| - sort.append(current) |
30 |
| - # if all vertices haven't been visited select a new one to visit |
31 |
| - if len(visited) != len(vertices): |
32 |
| - for vertice in vertices: |
33 |
| - if vertice not in visited: |
34 |
| - sort = topological_sort(vertice, visited, sort) |
35 |
| - # return sort |
36 |
| - return sort |
| 24 | + for neighbor in edges[node]: |
| 25 | + if neighbor not in visited: |
| 26 | + dfs(neighbor) |
| 27 | + |
| 28 | + stack.append(node) |
| 29 | + |
| 30 | + return stack |
| 31 | + |
| 32 | + result = dfs("a") |
| 33 | + return result[::-1] |
37 | 34 |
|
38 | 35 |
|
39 | 36 | if __name__ == "__main__":
|
40 |
| - sort = topological_sort("a", [], []) |
| 37 | + topo = Topo() |
| 38 | + sort = topo.topo_sort() |
41 | 39 | print(sort)
|
0 commit comments