mirror of
https://github.com/TheAlgorithms/Python.git
synced 2025-04-22 13:47:37 +00:00
[pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
This commit is contained in:
parent
2b50d97d3e
commit
40e312af1b
@ -14,20 +14,29 @@ def print_distance_and_paths(distance: List[float], paths: List[List[int]], src:
|
|||||||
print(f"{vertex}\t\t{dist}\t\t\t\t{path_str}")
|
print(f"{vertex}\t\t{dist}\t\t\t\t{path_str}")
|
||||||
|
|
||||||
|
|
||||||
def check_negative_cycle(graph: List[Edge], distance: List[float], predecessor: List[int]) -> bool:
|
def check_negative_cycle(
|
||||||
|
graph: List[Edge], distance: List[float], predecessor: List[int]
|
||||||
|
) -> bool:
|
||||||
"""
|
"""
|
||||||
Checks if there is a negative weight cycle reachable from the source vertex.
|
Checks if there is a negative weight cycle reachable from the source vertex.
|
||||||
If found, return True, indicating a negative cycle.
|
If found, return True, indicating a negative cycle.
|
||||||
"""
|
"""
|
||||||
for edge in graph:
|
for edge in graph:
|
||||||
if distance[edge.src] != float("inf") and distance[edge.src] + edge.weight < distance[edge.dst]:
|
if (
|
||||||
|
distance[edge.src] != float("inf")
|
||||||
|
and distance[edge.src] + edge.weight < distance[edge.dst]
|
||||||
|
):
|
||||||
# Update predecessors to indicate a cycle for affected paths
|
# Update predecessors to indicate a cycle for affected paths
|
||||||
predecessor[edge.dst] = -1 # Use -1 as a marker for negative cycle detection
|
predecessor[
|
||||||
|
edge.dst
|
||||||
|
] = -1 # Use -1 as a marker for negative cycle detection
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def reconstruct_paths(predecessor: List[int], vertex_count: int, src: int) -> List[List[int]]:
|
def reconstruct_paths(
|
||||||
|
predecessor: List[int], vertex_count: int, src: int
|
||||||
|
) -> List[List[int]]:
|
||||||
"""
|
"""
|
||||||
Reconstructs the shortest paths from the source vertex to each vertex using the predecessor list.
|
Reconstructs the shortest paths from the source vertex to each vertex using the predecessor list.
|
||||||
"""
|
"""
|
||||||
@ -47,7 +56,9 @@ def reconstruct_paths(predecessor: List[int], vertex_count: int, src: int) -> Li
|
|||||||
return paths
|
return paths
|
||||||
|
|
||||||
|
|
||||||
def bellman_ford(graph: List[Edge], vertex_count: int, src: int) -> Tuple[List[float], List[List[int]]]:
|
def bellman_ford(
|
||||||
|
graph: List[Edge], vertex_count: int, src: int
|
||||||
|
) -> Tuple[List[float], List[List[int]]]:
|
||||||
"""
|
"""
|
||||||
Returns the shortest paths from a vertex src to all other vertices, including path reconstruction.
|
Returns the shortest paths from a vertex src to all other vertices, including path reconstruction.
|
||||||
"""
|
"""
|
||||||
@ -58,7 +69,10 @@ def bellman_ford(graph: List[Edge], vertex_count: int, src: int) -> Tuple[List[f
|
|||||||
# Step 1: Relax edges repeatedly
|
# Step 1: Relax edges repeatedly
|
||||||
for _ in range(vertex_count - 1):
|
for _ in range(vertex_count - 1):
|
||||||
for edge in graph:
|
for edge in graph:
|
||||||
if distance[edge.src] != float("inf") and distance[edge.src] + edge.weight < distance[edge.dst]:
|
if (
|
||||||
|
distance[edge.src] != float("inf")
|
||||||
|
and distance[edge.src] + edge.weight < distance[edge.dst]
|
||||||
|
):
|
||||||
distance[edge.dst] = distance[edge.src] + edge.weight
|
distance[edge.dst] = distance[edge.src] + edge.weight
|
||||||
predecessor[edge.dst] = edge.src
|
predecessor[edge.dst] = edge.src
|
||||||
|
|
||||||
@ -75,6 +89,7 @@ def bellman_ford(graph: List[Edge], vertex_count: int, src: int) -> Tuple[List[f
|
|||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
# Example graph input for testing purposes
|
# Example graph input for testing purposes
|
||||||
import doctest
|
import doctest
|
||||||
|
|
||||||
doctest.testmod()
|
doctest.testmod()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@ -85,7 +100,9 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
for i in range(E):
|
for i in range(E):
|
||||||
print(f"Edge {i + 1}")
|
print(f"Edge {i + 1}")
|
||||||
src, dest, weight = map(int, input("Enter source, destination, weight: ").strip().split())
|
src, dest, weight = map(
|
||||||
|
int, input("Enter source, destination, weight: ").strip().split()
|
||||||
|
)
|
||||||
if src < 0 or src >= V or dest < 0 or dest >= V:
|
if src < 0 or src >= V or dest < 0 or dest >= V:
|
||||||
print(f"Invalid vertices: src and dest should be between 0 and {V - 1}")
|
print(f"Invalid vertices: src and dest should be between 0 and {V - 1}")
|
||||||
continue
|
continue
|
||||||
|
Loading…
x
Reference in New Issue
Block a user