@@ -700,7 +700,7 @@ def shortest_paths(graph: Graph, algorithm: str,
700700 The algorithm to be used. Currently, the following algorithms
701701 are implemented,
702702
703- 'bellman_ford' -> Bellman-Ford algorithm as given in [1].
703+ 'bellman_ford' -> Bellman-Ford algorithm as given in [1]
704704
705705 'dijkstra' -> Dijkstra algorithm as given in [2].
706706 source: str
@@ -757,27 +757,34 @@ def shortest_paths(graph: Graph, algorithm: str,
757757 return getattr (algorithms , func )(graph , source , target )
758758
759759def _bellman_ford_adjacency_list (graph : Graph , source : str , target : str ) -> tuple :
760- distances , predecessor = {}, {}
760+ distances , predecessor , visited , cnts = {}, {}, {}, {}
761761
762762 for v in graph .vertices :
763763 distances [v ] = float ('inf' )
764764 predecessor [v ] = None
765+ visited [v ] = False
766+ cnts [v ] = 0
765767 distances [source ] = 0
768+ verticy_num = len (graph .vertices )
766769
767- edges = graph .edge_weights .values ()
768- for _ in range (len (graph .vertices ) - 1 ):
769- for edge in edges :
770- u , v = edge .source .name , edge .target .name
771- w = edge .value
772- if distances [u ] + edge .value < distances [v ]:
773- distances [v ] = distances [u ] + w
774- predecessor [v ] = u
770+ que = Queue ([source ])
775771
776- for edge in edges :
777- u , v = edge .source .name , edge .target .name
778- w = edge .value
779- if distances [u ] + w < distances [v ]:
780- raise ValueError ("Graph contains a negative weight cycle." )
772+ while que :
773+ u = que .popleft ()
774+ visited [u ] = False
775+ neighbors = graph .neighbors (u )
776+ for neighbor in neighbors :
777+ v = neighbor .name
778+ edge_str = u + '_' + v
779+ if distances [u ] != float ('inf' ) and distances [u ] + graph .edge_weights [edge_str ].value < distances [v ]:
780+ distances [v ] = distances [u ] + graph .edge_weights [edge_str ].value
781+ predecessor [v ] = u
782+ cnts [v ] = cnts [u ] + 1
783+ if cnts [v ] >= verticy_num :
784+ raise ValueError ("Graph contains a negative weight cycle." )
785+ if not visited [v ]:
786+ que .append (v )
787+ visited [v ] = True
781788
782789 if target != "" :
783790 return (distances [target ], predecessor )
0 commit comments