Skip to content

Commit e678abd

Browse files
committed
first commit.
1 parent e622137 commit e678abd

File tree

1 file changed

+82
-0
lines changed

1 file changed

+82
-0
lines changed
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
const PriorityQueue = require('../../data-structures/PriorityQueue');
2+
const Graph = require('../../data-structures/Graph');
3+
4+
function dijkstrasAlgorithm(graph, source, target) {
5+
const dijkstrasInfo = new Map();
6+
7+
graph.forEach((_, vertex) => {
8+
const distanceToSource = vertex === source ? 0 : Infinity;
9+
dijkstrasInfo.set(vertex, { distanceToSource, parent: null });
10+
});
11+
12+
const pq = new PriorityQueue(
13+
(vertexA, vertexB) => vertexA.distanceToSource - vertexB.distanceToSource
14+
);
15+
16+
pq.insert({
17+
vertex: source,
18+
distanceToSource: 0,
19+
});
20+
21+
const visited = new Set();
22+
23+
while (pq.size() > 0) {
24+
const { vertex, distanceToSource } = pq.pull();
25+
26+
if (vertex === target) {
27+
return constructPath(dijkstrasInfo, target);
28+
}
29+
30+
if (visited.has(vertex)) {
31+
continue;
32+
}
33+
34+
visited.add(vertex);
35+
36+
const neighbors = graph.get(vertex).to;
37+
38+
neighbors.forEach((weight, neighbor) => {
39+
if (visited.has(neighbor)) {
40+
return;
41+
}
42+
43+
const newDistanceToSource = distanceToSource + weight;
44+
const oldDistanceToSource = dijkstrasInfo.get(neighbor).distanceToSource;
45+
46+
if (newDistanceToSource < oldDistanceToSource) {
47+
dijkstrasInfo.set(neighbor, {
48+
distanceToSource: newDistanceToSource,
49+
parent: vertex,
50+
});
51+
pq.insert({ vertex: neighbor, distanceToSource: newDistanceToSource });
52+
}
53+
});
54+
}
55+
56+
return [];
57+
}
58+
59+
function constructPath(dijkstrasInfo, target) {
60+
const path = [];
61+
let vertex = target;
62+
63+
while (vertex) {
64+
path.push(vertex);
65+
const { parent } = dijkstrasInfo.get(vertex);
66+
vertex = parent;
67+
}
68+
69+
return path.reverse();
70+
}
71+
72+
const graph = new Graph();
73+
graph.addEdge('A', 'B', 4);
74+
graph.addEdge('A', 'C', 7);
75+
graph.addEdge('B', 'C', 2);
76+
graph.addEdge('C', 'D', 3);
77+
graph.addEdge('C', 'F', 6);
78+
graph.addEdge('C', 'E', 1);
79+
graph.addEdge('D', 'F', 2);
80+
graph.addEdge('E', 'F', 3);
81+
const path = dijkstrasAlgorithm(graph.vertices, 'A', 'F');
82+
console.log(path);

0 commit comments

Comments
 (0)