@@ -697,7 +697,7 @@ def shortest_paths(graph: Graph, algorithm: str,
697697        The algorithm to be used. Currently, the following algorithms 
698698        are implemented, 
699699
700-         'bellman_ford' -> Bellman-Ford algorithm as given in [1].  
700+         'bellman_ford' -> Bellman-Ford algorithm as given in [1] 
701701
702702        'dijkstra' -> Dijkstra algorithm as given in [2]. 
703703    source: str 
@@ -754,27 +754,34 @@ def shortest_paths(graph: Graph, algorithm: str,
754754    return  getattr (algorithms , func )(graph , source , target )
755755
756756def  _bellman_ford_adjacency_list (graph : Graph , source : str , target : str ) ->  tuple :
757-     distances , predecessor   =  {}, {}
757+     distances , predecessor ,  visited ,  cnts   =  {}, {},  {}, {}
758758
759759    for  v  in  graph .vertices :
760760        distances [v ] =  float ('inf' )
761761        predecessor [v ] =  None 
762+         visited [v ] =  False 
763+         cnts [v ] =  0 
762764    distances [source ] =  0 
765+     verticy_num  =  len (graph .vertices )
763766
764-     edges  =  graph .edge_weights .values ()
765-     for  _  in  range (len (graph .vertices ) -  1 ):
766-         for  edge  in  edges :
767-             u , v  =  edge .source .name , edge .target .name 
768-             w  =  edge .value 
769-             if  distances [u ] +  edge .value  <  distances [v ]:
770-                 distances [v ] =  distances [u ] +  w 
771-                 predecessor [v ] =  u 
767+     que  =  Queue ([source ])
772768
773-     for  edge  in  edges :
774-         u , v  =  edge .source .name , edge .target .name 
775-         w  =  edge .value 
776-         if  distances [u ] +  w  <  distances [v ]:
777-             raise  ValueError ("Graph contains a negative weight cycle." )
769+     while  que :
770+         u  =  que .popleft ()
771+         visited [u ] =  False 
772+         neighbors  =  graph .neighbors (u )
773+         for  neighbor  in  neighbors :
774+             v  =  neighbor .name 
775+             edge_str  =  u  +  '_'  +  v 
776+             if  distances [u ] !=  float ('inf' ) and  distances [u ] +  graph .edge_weights [edge_str ].value  <  distances [v ]:
777+                 distances [v ] =  distances [u ] +  graph .edge_weights [edge_str ].value 
778+                 predecessor [v ] =  u 
779+                 cnts [v ] =  cnts [u ] +  1 
780+                 if  cnts [v ] >=  verticy_num :
781+                     raise  ValueError ("Graph contains a negative weight cycle." )
782+                 if  not  visited [v ]:
783+                     que .append (v )
784+                     visited [v ] =  True 
778785
779786    if  target  !=  "" :
780787        return  (distances [target ], predecessor )
0 commit comments