Given a weighted graph, a source and a destination vertices in the graph, find the shortest paths from the source to the destination vertices in the given graph.
Initialization:
Iteration, while the queue is not empty:
Dequeue the node with the smallest distance from the queue.
For each neighbor of the dequeued node:
Result:
class Queue: def __init__(self): self.list = [] def enqueue(self, item, distance): self.list.append((item, distance)) self.list.sort(key = lambda x: x[1]) def dequeue(self): return self.list.pop(0)[0] def isEmpty(self): return len(self.list) == 0 def dijkstra(graph, src): dist = {} visited = {} parent = {} queue = Queue() for node in graph: dist[node] = float('inf') visited[node] = False parent[node] = None dist[src] = 0 queue.enqueue(src, 0) while (not queue.isEmpty()): v = queue.dequeue() visited[v] = True for neighbor in graph[v]: alt = dist[v] + graph[v][neighbor] if not visited[neighbor] and alt < dist[neighbor]: dist[neighbor] = alt parent[neighbor] = v queue.enqueue(neighbor, alt) return (dist, parent) def reconstructPath(parent, dest): path = [] at = dest while (parent[at]): path.insert(0, at) at = parent[at] path.insert(0, at) return path graph = { "A": { "B": 4, "C": 2 }, "B": { "A": 4, "C": 1, "D": 5 }, "C": { "A": 2, "B": 1, "D": 1 }, "D": { "B": 5, "C": 1 } } source = 'A' destination = 'D' (dist, parent) = dijkstra(graph, source) print(reconstructPath(parent, destination))
class Queue { constructor() { this.list = []; } enqueue(item, distance) { this.list.push({item, distance}); this.list.sort((a, b) => a.distance - b.distance); } dequeue() { return this.list.shift().item; } isEmpty() { return this.list.length === 0; } } function dijkstra(graph, src) { const dist = {}; const visited = {}; const parent = {}; const queue = new Queue(); for (const node in graph) { dist[node] = Infinity; visited[node] = false; parent[node] = null; } dist[src] = 0; queue.enqueue(src, 0); while (!queue.isEmpty()) { const v = queue.dequeue(); visited[v] = true; for (const neighbor in graph[v]) { const alt = dist[v] + graph[v][neighbor]; if (!visited[neighbor] && alt < dist[neighbor]) { dist[neighbor] = alt; parent[neighbor] = v; queue.enqueue(neighbor, alt); } } } return { dist, parent }; } function reconstructPath(parent, dest) { const path = []; let at = dest; while (parent[at]) { path.unshift(at); at = parent[at]; } path.unshift(at); return path; } const graph = { A: { B: 4, C: 2 }, B: { A: 4, C: 1, D: 5 }, C: { A: 2, B: 1, D: 1 }, D: { B: 5, C: 1 } }; const source = 'A'; const destination = 'D'; const { dist, parent } = dijkstra(graph, source); console.log(reconstructPath(parent, destination));