forked from TheAlgorithms/JavaScript
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDijkstra’s Algorithm
85 lines (73 loc) · 2.67 KB
/
Dijkstra’s Algorithm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
class Graph {
constructor() {
this.adjacencyList = new Map();
}
addVertex(vertex) {
if (!this.adjacencyList.has(vertex)) {
this.adjacencyList.set(vertex, []);
}
}
addEdge(source, destination, weight) {
if (!this.adjacencyList.has(source)) {
this.addVertex(source);
}
if (!this.adjacencyList.has(destination)) {
this.addVertex(destination);
}
this.adjacencyList.get(source).push({ node: destination, weight });
}
dijkstra(start, end) {
const distances = {};
const visited = new Set();
const priorityQueue = new Map();
const previous = {};
// Initialize distances and previous map
for (let vertex of this.adjacencyList.keys()) {
distances[vertex] = Infinity;
previous[vertex] = null;
}
distances[start] = 0;
priorityQueue.set(start, 0);
while (priorityQueue.size > 0) {
// Get the node with the smallest distance
let [currentNode, currentDistance] = [...priorityQueue.entries()].reduce((a, b) => (a[1] < b[1] ? a : b));
priorityQueue.delete(currentNode);
// If we reached the destination node, build and return the path
if (currentNode === end) {
const path = [];
while (previous[currentNode]) {
path.push(currentNode);
currentNode = previous[currentNode];
}
return { path: path.reverse(), distance: distances[end] };
}
visited.add(currentNode);
// Update distances and queue with neighbors
for (let neighbor of this.adjacencyList.get(currentNode)) {
if (!visited.has(neighbor.node)) {
const newDist = currentDistance + neighbor.weight;
if (newDist < distances[neighbor.node]) {
distances[neighbor.node] = newDist;
previous[neighbor.node] = currentNode;
priorityQueue.set(neighbor.node, newDist);
}
}
}
}
return { path: [], distance: Infinity }; // Path not found
}
}
// Example Usage:
const graph = new Graph();
graph.addVertex("A");
graph.addVertex("B");
graph.addVertex("C");
graph.addVertex("D");
graph.addEdge("A", "B", 5);
graph.addEdge("A", "C", 2);
graph.addEdge("B", "D", 1);
graph.addEdge("C", "B", 8);
graph.addEdge("C", "D", 7);
const result = graph.dijkstra("A", "D");
console.log("Shortest path:", result.path);
console.log("Shortest distance:", result.distance);