From c97e472db796374e0fe4b0609353309981c6ea98 Mon Sep 17 00:00:00 2001 From: Oleksii Trekhleb Date: Thu, 3 May 2018 06:54:51 +0300 Subject: [PATCH] Add Dijkstra. --- src/algorithms/graph/dijkstra/__test__/dijkstra.test.js | 8 +++++++- src/algorithms/graph/dijkstra/dijkstra.js | 9 ++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/algorithms/graph/dijkstra/__test__/dijkstra.test.js b/src/algorithms/graph/dijkstra/__test__/dijkstra.test.js index 3d76f21d..c4ce7af8 100644 --- a/src/algorithms/graph/dijkstra/__test__/dijkstra.test.js +++ b/src/algorithms/graph/dijkstra/__test__/dijkstra.test.js @@ -43,7 +43,7 @@ describe('dijkstra', () => { .addEdge(edgeFG) .addEdge(edgeEG); - const distances = dijkstra(graph, vertexA); + const { distances, previousVertices } = dijkstra(graph, vertexA); expect(distances).toEqual({ H: Infinity, @@ -55,5 +55,11 @@ describe('dijkstra', () => { G: 12, F: 11, }); + + expect(previousVertices.F.getKey()).toBe('D'); + expect(previousVertices.D.getKey()).toBe('B'); + expect(previousVertices.B.getKey()).toBe('A'); + expect(previousVertices.G.getKey()).toBe('E'); + expect(previousVertices.C.getKey()).toBe('A'); }); }); diff --git a/src/algorithms/graph/dijkstra/dijkstra.js b/src/algorithms/graph/dijkstra/dijkstra.js index 439efce3..8d545ecc 100644 --- a/src/algorithms/graph/dijkstra/dijkstra.js +++ b/src/algorithms/graph/dijkstra/dijkstra.js @@ -7,6 +7,7 @@ import PriorityQueue from '../../../data-structures/priority-queue/PriorityQueue export default function dijkstra(graph, startVertex) { const distances = {}; const visitedVertices = {}; + const previousVertices = {}; const queue = new PriorityQueue(); // Init all distances with infinity assuming that currently we can't reach @@ -38,6 +39,9 @@ export default function dijkstra(graph, startVertex) { if (queue.hasValue(neighbor)) { queue.changePriority(neighbor, distances[neighbor.getKey()]); } + + // Remember previous vertex. + previousVertices[neighbor.getKey()] = currentVertex; } // Add neighbor to the queue for further visiting. @@ -51,5 +55,8 @@ export default function dijkstra(graph, startVertex) { visitedVertices[currentVertex.getKey()] = currentVertex; } - return distances; + return { + distances, + previousVertices, + }; }