Here is the Dijkstra's algorithm I am using to study. This is a Javascript implementation, please feel free to comment and share another good implementation that you might know of.
// Dijkstra's
function dijkstra(graph, src) {
const dist = [], path = [], visited = [], N = graph.length;
for (let i = 0; i < N; i++) {
dist[i] = Infinity;
visited[i] = false
path[i] = []
}
dist[src] = 0
for (let i = 0; i < N; i++) {
let u = minDistances(dist, visited)
visited[u] = true;
for (let v = 0; v < N; v++) {
if (visited[v] || !graph[u][v] || dist[u] === Infinity) continue
if (dist[u] + graph[u][v] < dist[v]) {
if (dist[v] !== Infinity) path[v].pop()
dist[v] = dist[u] + graph[u][v]
path[v].push(u)
path[v].push(...path[u])
}
}
}
return [dist, path]
}
function minDistances(dist, visited) {
let min = Infinity, minIndex = -1
for (let v = 0; v < dist.length; v++) {
if (visited[v] === false && dist[v] <= min) {
min = dist[v]
minIndex = v
}
}
return minIndex
}
const matrix = [
[0, 2, 4, 0, 0, 0],
[0, 0, 1, 4, 2, 0],
[0, 0, 0, 0, 3, 0],
[0, 0, 0, 0, 0, 2],
[0, 0, 0, 3, 0, 2],
[0, 0, 0, 0, 0, 0]
]
const res = dijkstra(matrix, 0)
console.log(res)
The below is simlar to above, but with an Adjacent List instead of a Matrix.
// Dijkstra's
function dijkstra(source, adj) {
const N = adj.size
const dist = new Array(N).fill(Infinity)
const visited = new Array(N).fill(false)
dist[source] = 0
for (let i = 0; i < N; i++) {
const u = minDistance(dist, visited)
visited[u] = true
if (dist[u] === Infinity) continue
for (let v of adj.get(u)) {
if (visited[v.index]) continue
if (dist[v.index] > dist[u] + v.weight) {
dist[v.index] = dist[u] + v.weight
}
}
}
return dist
}
function minDistance(dist, visited) {
let min = Infinity, minIndex = -1
for (let i = 0; i < dist.length; i++) {
if (!visited[i] && dist[i] < min) {
min = dist[i]
minIndex = i
}
}
return minIndex
}
function buildAdj(graph) {
const adj = new Map()
for (let r = 0; r < graph.length; r++) {
adj.set(r, new Set())
for (let c = 0; c < graph[r].length; c++) {
if (!graph[r][c]) continue
adj.get(r).add({ index: c, weight: graph[r][c] })
}
}
return adj
}
const matrix = [
[0, 2, 4, 0, 0, 0],
[0, 0, 1, 4, 2, 0],
[0, 0, 0, 0, 3, 0],
[0, 0, 0, 0, 0, 2],
[0, 0, 0, 3, 0, 2],
[0, 0, 0, 0, 0, 0]
]
const adj = buildAdj(matrix)
const res = dijkstra(0, adj)
console.log(res)