JSFiddle - React, Tailwind, and code Playground
HTML
<canvas width="640" height="320"></canvas>
CSS
canvas {
border: 1px solid #000000;
}
JavaScript
Graph.prototype.addEdge = function (from, to, distance) {
this.vertices[from][this.v - to] = distance;
return this;
};
Graph.prototype.getEdge = function (a, b) {
if (b < a) {
var t = a;
a = b;
b = t;
}
return this.vertices[a][this.v - b];
};
Graph.prototype.shortest = function () {
var v = this.v;
var w = v + 1;
var distance = [0];
var unvisited = [0];
var graph = new Graph(w);
var previous = new Array(w);
for (var i = 0; i < v;) {
distance.push(Infinity);
unvisited.push(++i);
}
while (unvisited.length) {
var undetermined = [];
var length = unvisited.length;
for (var i = 0; i < length; i++)
undetermined.push(distance[unvisited[i]]);
var determined = Math.min.apply(Math, undetermined);
if (determined === Infinity) break;
var current = distance.indexOf(determined);
var index = unvisited.indexOf(current);
unvisited.splice(index, 1);
for (var i = 0; i < w; i++) {
if (unvisited.indexOf(i) < 0) continue;
var edge = this.getEdge(current, i);
if (edge < Infinity) {
var alternate = determined + edge;
if (alternate < distance[i]) {
distance[i] = alternate;
previous[i] = current;
}
}
}
}
for (var i = 0; i < w; i++) {
var prev = previous[i];
if (typeof prev !== "undefined")
graph.addEdge(prev, i, this.getEdge(prev, i));
}
return graph;
};
var graph = new Graph(6)
.addEdge(0, 1, 7)
.addEdge(0, 2, 9)
.addEdge(0, 3, 14)
.addEdge(1, 2, 10)
.addEdge(1, 4, 15)
.addEdge(2, 3, 2)
.addEdge(2, 4, 11)
.addEdge(3, 5, 9)
.addEdge(4, 5, 6);
var canvas = document.querySelector("canvas");
var context = canvas.getContext("2d");
context.textBaseline = "middle";
context.textAlign =...