JSFiddle - React, Tailwind, and code Playground
HTML
<pre id="output"></pre>
JavaScript
var graph = {
A: { B: '5', D: '5', E: '7' },
B: { C: '4' },
C: { D: '8', E: '2' },
D: { C: '8', E: '6' },
E: { B: '3' }};
function dijkstra(graphStart, graphEnd) {
var dist = {};
var done = {};
var prev = {};
for(var i in graph) {
dist[i] = Infinity;
prev[i] = 0;
done[i] = false;
}
dist[graphStart] = 0;
var closest;
var minDist;
var finalPath = [];
for(var i in graph) {
minDist = Infinity, closest;
for(var j in graph) {
if(!done[j]) {
if(dist[j] <= minDist) {
minDist = dist[j];
closest = j;
}
}
}
done[closest] = true;
var neighbors = tracksFrom(closest);
for(var nb in neighbors) {
var w = neighbors[nb];
if(!done[nb]) {
if(dist[closest] + w < dist[nb]) {
dist[nb] = dist[closest] + w;
prev[nb] = closest;
}
}
}
}
// tidy
var route = [[graphEnd, 0]];
var last = graphEnd;
while(true) {
last = prev[last];
if(last != 0) {
var prevStaton = graph[last];
route.push([last, prevStaton[route[route.length-1][0]]]);
} else {
break;
}
}
route.reverse();
//now returns: [ [ 'A', 5 ], [ 'B', 4 ], [ 'C', 0 ] ]
return route;
};
function tracksFrom(node) {
var found = graph[node];
if(found === undefined) {
return false;
} else {
return found;
}
}
function out()
{
var args = Array.prototype.slice.call(arguments, 0);
document.getElementById('output').innerHTML += args.join(" ") + "\n";
}
out("A-C - should be A-B-C : 5 4 0 (so, 9)");
out(dijkstra("A", "C"));
out("")
out("")
out("B-B - should be B-C-E-B : 4 2 3 0 (so again, 9)");
out(dijkstra("B", "B"));