dist-javascript-algorithms-and-data-structures
Version:
Algorithms and data-structures implemented on JavaScript
97 lines (91 loc) • 4.31 kB
JavaScript
"use strict";
var _GraphVertex = _interopRequireDefault(require("../../../../data-structures/graph/GraphVertex"));
var _GraphEdge = _interopRequireDefault(require("../../../../data-structures/graph/GraphEdge"));
var _Graph = _interopRequireDefault(require("../../../../data-structures/graph/Graph"));
var _dijkstra = _interopRequireDefault(require("../dijkstra"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
describe('dijkstra', () => {
it('should find minimum paths to all vertices for undirected graph', () => {
const vertexA = new _GraphVertex.default('A');
const vertexB = new _GraphVertex.default('B');
const vertexC = new _GraphVertex.default('C');
const vertexD = new _GraphVertex.default('D');
const vertexE = new _GraphVertex.default('E');
const vertexF = new _GraphVertex.default('F');
const vertexG = new _GraphVertex.default('G');
const vertexH = new _GraphVertex.default('H');
const edgeAB = new _GraphEdge.default(vertexA, vertexB, 4);
const edgeAE = new _GraphEdge.default(vertexA, vertexE, 7);
const edgeAC = new _GraphEdge.default(vertexA, vertexC, 3);
const edgeBC = new _GraphEdge.default(vertexB, vertexC, 6);
const edgeBD = new _GraphEdge.default(vertexB, vertexD, 5);
const edgeEC = new _GraphEdge.default(vertexE, vertexC, 8);
const edgeED = new _GraphEdge.default(vertexE, vertexD, 2);
const edgeDC = new _GraphEdge.default(vertexD, vertexC, 11);
const edgeDG = new _GraphEdge.default(vertexD, vertexG, 10);
const edgeDF = new _GraphEdge.default(vertexD, vertexF, 2);
const edgeFG = new _GraphEdge.default(vertexF, vertexG, 3);
const edgeEG = new _GraphEdge.default(vertexE, vertexG, 5);
const graph = new _Graph.default();
graph.addVertex(vertexH).addEdge(edgeAB).addEdge(edgeAE).addEdge(edgeAC).addEdge(edgeBC).addEdge(edgeBD).addEdge(edgeEC).addEdge(edgeED).addEdge(edgeDC).addEdge(edgeDG).addEdge(edgeDF).addEdge(edgeFG).addEdge(edgeEG);
const {
distances,
previousVertices
} = (0, _dijkstra.default)(graph, vertexA);
expect(distances).toEqual({
H: Infinity,
A: 0,
B: 4,
E: 7,
C: 3,
D: 9,
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');
expect(previousVertices.A).toBeNull();
expect(previousVertices.H).toBeNull();
});
it('should find minimum paths to all vertices for directed graph with negative edge weights', () => {
const vertexS = new _GraphVertex.default('S');
const vertexE = new _GraphVertex.default('E');
const vertexA = new _GraphVertex.default('A');
const vertexD = new _GraphVertex.default('D');
const vertexB = new _GraphVertex.default('B');
const vertexC = new _GraphVertex.default('C');
const vertexH = new _GraphVertex.default('H');
const edgeSE = new _GraphEdge.default(vertexS, vertexE, 8);
const edgeSA = new _GraphEdge.default(vertexS, vertexA, 10);
const edgeED = new _GraphEdge.default(vertexE, vertexD, 1);
const edgeDA = new _GraphEdge.default(vertexD, vertexA, -4);
const edgeDC = new _GraphEdge.default(vertexD, vertexC, -1);
const edgeAC = new _GraphEdge.default(vertexA, vertexC, 2);
const edgeCB = new _GraphEdge.default(vertexC, vertexB, -2);
const edgeBA = new _GraphEdge.default(vertexB, vertexA, 1);
const graph = new _Graph.default(true);
graph.addVertex(vertexH).addEdge(edgeSE).addEdge(edgeSA).addEdge(edgeED).addEdge(edgeDA).addEdge(edgeDC).addEdge(edgeAC).addEdge(edgeCB).addEdge(edgeBA);
const {
distances,
previousVertices
} = (0, _dijkstra.default)(graph, vertexS);
expect(distances).toEqual({
H: Infinity,
S: 0,
A: 5,
B: 5,
C: 7,
D: 9,
E: 8
});
expect(previousVertices.H).toBeNull();
expect(previousVertices.S).toBeNull();
expect(previousVertices.B.getKey()).toBe('C');
expect(previousVertices.C.getKey()).toBe('A');
expect(previousVertices.A.getKey()).toBe('D');
expect(previousVertices.D.getKey()).toBe('E');
});
});