Skip to content

Commit 55a6d2c

Browse files
committed
graphs: return longest distance and add doctests to kahns_algorithm_long
1 parent 6e03a48 commit 55a6d2c

1 file changed

Lines changed: 36 additions & 7 deletions

File tree

‎graphs/kahns_algorithm_long.py‎

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,31 @@
11
# Finding longest distance in Directed Acyclic Graph using KahnsAlgorithm
2-
def longest_distance(graph) -> None:
2+
# https://en.wikipedia.org/wiki/Topological_sorting#Kahn's_algorithm
3+
from collections import deque
4+
5+
6+
def longest_distance(graph: dict[int, list[int]]) -> int:
7+
"""
8+
Return the number of vertices on the longest path in a directed acyclic graph.
9+
10+
The graph is an adjacency list whose keys are the vertices 0 to n - 1.
11+
A graph with no vertices has a longest distance of 0.
12+
13+
>>> longest_distance({0: [2, 3, 4], 1: [2, 7], 2: [5], 3: [5, 7], 4: [7],
14+
... 5: [6], 6: [7], 7: []})
15+
5
16+
>>> longest_distance({0: [1], 1: [2], 2: []})
17+
3
18+
>>> longest_distance({0: [1, 2], 1: [3], 2: [3], 3: []})
19+
3
20+
>>> longest_distance({0: [], 1: [], 2: []})
21+
1
22+
>>> longest_distance({0: []})
23+
1
24+
>>> longest_distance({})
25+
0
26+
"""
327
indegree = [0] * len(graph)
4-
queue = []
28+
queue: deque[int] = deque()
529
long_dist = [1] * len(graph)
630

731
for values in graph.values():
@@ -13,7 +37,7 @@ def longest_distance(graph) -> None:
1337
queue.append(i)
1438

1539
while queue:
16-
vertex = queue.pop(0)
40+
vertex = queue.popleft()
1741
for x in graph[vertex]:
1842
indegree[x] -= 1
1943

@@ -22,9 +46,14 @@ def longest_distance(graph) -> None:
2246
if indegree[x] == 0:
2347
queue.append(x)
2448

25-
print(max(long_dist))
49+
return max(long_dist, default=0)
2650

2751

28-
# Adjacency list of Graph
29-
graph = {0: [2, 3, 4], 1: [2, 7], 2: [5], 3: [5, 7], 4: [7], 5: [6], 6: [7], 7: []}
30-
longest_distance(graph)
52+
if __name__ == "__main__":
53+
import doctest
54+
55+
doctest.testmod()
56+
57+
# Adjacency list of Graph
58+
graph = {0: [2, 3, 4], 1: [2, 7], 2: [5], 3: [5, 7], 4: [7], 5: [6], 6: [7], 7: []}
59+
print(longest_distance(graph))

0 commit comments

Comments
 (0)