Skip to content

Commit 70fe099

Browse files
committed
Merge branch 'main' of https://github.com/codezonediitj/pydatastructs into yen_algo
2 parents 1ba4628 + f34b7d6 commit 70fe099

File tree

1 file changed

+22
-15
lines changed

1 file changed

+22
-15
lines changed

pydatastructs/graphs/algorithms.py

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -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

759759
def _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

Comments
 (0)