Conquering dynamic programming and graph algorithms requires recognizing underlying problem states and sub-problem optimal substructures.
Dijkstra Algorithm Template in Python
import heapq
def shortest_path(graph, start_node, n):
distances = {i: float('inf') for i in range(1, n + 1)}
distances[start_node] = 0
pq = [(0, start_node)]
while pq:
curr_dist, u = heapq.heappop(pq)
if curr_dist > distances[u]:
continue
for v, weight in graph[u]:
if distances[u] + weight < distances[v]:
distances[v] = distances[u] + weight
heapq.heappush(pq, (distances[v], v))
return distances