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