Module dsa.dijkstras
Module to access functions for Dijkstra's Algorithm.
Expand source code
""" Module to access functions for Dijkstra's Algorithm. """
from dsa.heap import MinHeap
from dsa.graph import AdjacencyListWeightedGraph
def shortest_path(graph: AdjacencyListWeightedGraph, start: str, end: str, debug=False):
"""
Helper function that returns a weight table and a previous vertex table using Dijkstra's Algorithm.
Args:
graph (AdjacencyListWeighted Graph): The graph to search.
start (str): The starting vertex label.
end (str): The ending vertex label.
debug (bool): If True, display weight table as it is being built.
Returns:
A tuple of a weight table dictionary and a previous path dictionary.
"""
weight_table = {}
previous = {}
visited = set()
h = MinHeap()
current = start
h.insert(current)
weight_table[current] = 0
previous[current] = current
while not h.is_empty():
current_weight = weight_table.get(current, float('inf'))
visited.add(current)
for adjacent in graph[current]:
weight = graph[current][adjacent]
if adjacent not in visited:
h.insert(adjacent)
wt = weight_table.get(adjacent, float('inf'))
if wt > weight + current_weight:
weight_table[adjacent] = weight + current_weight
previous[adjacent] = current
if debug:
print(weight_table)
current = h.pop()
return weight_table, previous
def find_path(graph: AdjacencyListWeightedGraph, start: str, end: str, debug=False) -> list:
"""
Return the shortest path of two vertices using Dijkstra's Algorithm.
Args:
graph (AdjacencyListWeighted Graph): The graph to search.
start (str): The starting vertex label.
end (str): The ending vertex label.
debug (bool): If True, display the weight table.
Returns:
A list of vertices that form a shortest path.
"""
weight_table, previous = shortest_path(graph, start, end, debug)
path = []
current = end
path.append(current)
while current != start:
current = previous[current]
path.append(current)
path.reverse()
if debug:
print("previous table")
print(previous)
print("weight table")
print(weight_table)
print("price ", weight_table[end])
return path
Functions
def find_path(graph: AdjacencyListWeightedGraph, start: str, end: str, debug=False) ‑> list
-
Return the shortest path of two vertices using Dijkstra's Algorithm.
Args
graph
:AdjacencyListWeighted Graph
- The graph to search.
start
:str
- The starting vertex label.
end
:str
- The ending vertex label.
debug
:bool
- If True, display the weight table.
Returns
A list of vertices that form a shortest path.
Expand source code
def find_path(graph: AdjacencyListWeightedGraph, start: str, end: str, debug=False) -> list: """ Return the shortest path of two vertices using Dijkstra's Algorithm. Args: graph (AdjacencyListWeighted Graph): The graph to search. start (str): The starting vertex label. end (str): The ending vertex label. debug (bool): If True, display the weight table. Returns: A list of vertices that form a shortest path. """ weight_table, previous = shortest_path(graph, start, end, debug) path = [] current = end path.append(current) while current != start: current = previous[current] path.append(current) path.reverse() if debug: print("previous table") print(previous) print("weight table") print(weight_table) print("price ", weight_table[end]) return path
def shortest_path(graph: AdjacencyListWeightedGraph, start: str, end: str, debug=False)
-
Helper function that returns a weight table and a previous vertex table using Dijkstra's Algorithm.
Args
graph
:AdjacencyListWeighted Graph
- The graph to search.
start
:str
- The starting vertex label.
end
:str
- The ending vertex label.
debug
:bool
- If True, display weight table as it is being built.
Returns
A tuple of a weight table dictionary and a previous path dictionary.
Expand source code
def shortest_path(graph: AdjacencyListWeightedGraph, start: str, end: str, debug=False): """ Helper function that returns a weight table and a previous vertex table using Dijkstra's Algorithm. Args: graph (AdjacencyListWeighted Graph): The graph to search. start (str): The starting vertex label. end (str): The ending vertex label. debug (bool): If True, display weight table as it is being built. Returns: A tuple of a weight table dictionary and a previous path dictionary. """ weight_table = {} previous = {} visited = set() h = MinHeap() current = start h.insert(current) weight_table[current] = 0 previous[current] = current while not h.is_empty(): current_weight = weight_table.get(current, float('inf')) visited.add(current) for adjacent in graph[current]: weight = graph[current][adjacent] if adjacent not in visited: h.insert(adjacent) wt = weight_table.get(adjacent, float('inf')) if wt > weight + current_weight: weight_table[adjacent] = weight + current_weight previous[adjacent] = current if debug: print(weight_table) current = h.pop() return weight_table, previous