Skip to content

Commit f50a3f8

Browse files
committed
Refactor DFS helper and add required doctest
1 parent be33ac2 commit f50a3f8

File tree

1 file changed

+29
-13
lines changed

1 file changed

+29
-13
lines changed

data_structures/sort/topological_sort.py

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,34 @@
1313
from typing import List
1414

1515

16+
def _dfs(
17+
node: int,
18+
graph: List[List[int]],
19+
visited: List[int],
20+
result: List[int],
21+
) -> None:
22+
"""
23+
Helper DFS function for topological sorting.
24+
25+
>>> graph = [[1], [], []]
26+
>>> visited = [0, 0, 0]
27+
>>> result = []
28+
>>> _dfs(0, graph, visited, result)
29+
>>> result
30+
[0]
31+
"""
32+
if visited[node] == 1:
33+
raise ValueError("Graph contains a cycle")
34+
if visited[node] == 2:
35+
return
36+
37+
visited[node] = 1
38+
for neighbor in graph[node]:
39+
_dfs(neighbor, graph, visited, result)
40+
visited[node] = 2
41+
result.append(node)
42+
43+
1644
def topological_sort_dfs(vertices: int, edges: List[List[int]]) -> List[int]:
1745
"""
1846
Perform topological sort using DFS.
@@ -30,21 +58,9 @@ def topological_sort_dfs(vertices: int, edges: List[List[int]]) -> List[int]:
3058
visited = [0] * vertices
3159
result: List[int] = []
3260

33-
def dfs(node: int) -> None:
34-
if visited[node] == 1:
35-
raise ValueError("Graph contains a cycle")
36-
if visited[node] == 2:
37-
return
38-
39-
visited[node] = 1
40-
for neighbor in graph[node]:
41-
dfs(neighbor)
42-
visited[node] = 2
43-
result.append(node)
44-
4561
for vertex in range(vertices):
4662
if visited[vertex] == 0:
47-
dfs(vertex)
63+
_dfs(vertex, graph, visited, result)
4864

4965
return result[::-1]
5066

0 commit comments

Comments
 (0)