|
1 |
| -"""Topological Sort.""" |
2 |
| - |
3 |
| -# a |
4 |
| -# / \ |
5 |
| -# b c |
6 |
| -# / \ |
7 |
| -# d e |
8 | 1 | edges: dict[str, list[str]] = {
|
9 | 2 | "a": ["c", "b"],
|
10 | 3 | "b": ["d", "e"],
|
|
14 | 7 | }
|
15 | 8 | vertices: list[str] = ["a", "b", "c", "d", "e"]
|
16 | 9 |
|
17 |
| - |
18 | 10 | def topological_sort(start: str, visited: list[str], sort: list[str]) -> list[str]:
|
19 |
| - """Perform topological sort on a directed acyclic graph.""" |
| 11 | + visited.append(start) |
20 | 12 | 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 |
| 13 | + for neighbor in edges[start]: |
26 | 14 | if neighbor not in visited:
|
27 |
| - sort = topological_sort(neighbor, visited, sort) |
28 |
| - # if all neighbors visited add current to sort |
| 15 | + topological_sort(neighbor, visited, sort) |
29 | 16 | 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 | 17 | return sort
|
37 | 18 |
|
38 |
| - |
39 | 19 | if __name__ == "__main__":
|
40 | 20 | sort = topological_sort("a", [], [])
|
| 21 | + sort.reverse() #Top down approach |
41 | 22 | print(sort)
|
0 commit comments