dist-javascript-algorithms-and-data-structures
Version:
Algorithms and data-structures implemented on JavaScript
51 lines (42 loc) • 1.61 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = bellmanFord;
/**
* @param {Graph} graph
* @param {GraphVertex} startVertex
* @return {{distances, previousVertices}}
*/
function bellmanFord(graph, startVertex) {
const distances = {};
const previousVertices = {}; // Init all distances with infinity assuming that currently we can't reach
// any of the vertices except start one.
distances[startVertex.getKey()] = 0;
graph.getAllVertices().forEach(vertex => {
previousVertices[vertex.getKey()] = null;
if (vertex.getKey() !== startVertex.getKey()) {
distances[vertex.getKey()] = Infinity;
}
}); // We need (|V| - 1) iterations.
for (let iteration = 0; iteration < graph.getAllVertices().length - 1; iteration += 1) {
// During each iteration go through all vertices.
Object.keys(distances).forEach(vertexKey => {
const vertex = graph.getVertexByKey(vertexKey); // Go through all vertex edges.
graph.getNeighbors(vertex).forEach(neighbor => {
const edge = graph.findEdge(vertex, neighbor); // Find out if the distance to the neighbor is shorter in this iteration
// then in previous one.
const distanceToVertex = distances[vertex.getKey()];
const distanceToNeighbor = distanceToVertex + edge.weight;
if (distanceToNeighbor < distances[neighbor.getKey()]) {
distances[neighbor.getKey()] = distanceToNeighbor;
previousVertices[neighbor.getKey()] = vertex;
}
});
});
}
return {
distances,
previousVertices
};
}