Spaces:
Build error
Build error
import * as _ from 'lodash-es'; | |
export { floydWarshall }; | |
var DEFAULT_WEIGHT_FUNC = _.constant(1); | |
function floydWarshall(g, weightFn, edgeFn) { | |
return runFloydWarshall( | |
g, | |
weightFn || DEFAULT_WEIGHT_FUNC, | |
edgeFn || | |
function (v) { | |
return g.outEdges(v); | |
} | |
); | |
} | |
function runFloydWarshall(g, weightFn, edgeFn) { | |
var results = {}; | |
var nodes = g.nodes(); | |
nodes.forEach(function (v) { | |
results[v] = {}; | |
results[v][v] = { distance: 0 }; | |
nodes.forEach(function (w) { | |
if (v !== w) { | |
results[v][w] = { distance: Number.POSITIVE_INFINITY }; | |
} | |
}); | |
edgeFn(v).forEach(function (edge) { | |
var w = edge.v === v ? edge.w : edge.v; | |
var d = weightFn(edge); | |
results[v][w] = { distance: d, predecessor: v }; | |
}); | |
}); | |
nodes.forEach(function (k) { | |
var rowK = results[k]; | |
nodes.forEach(function (i) { | |
var rowI = results[i]; | |
nodes.forEach(function (j) { | |
var ik = rowI[k]; | |
var kj = rowK[j]; | |
var ij = rowI[j]; | |
var altDistance = ik.distance + kj.distance; | |
if (altDistance < ij.distance) { | |
ij.distance = altDistance; | |
ij.predecessor = kj.predecessor; | |
} | |
}); | |
}); | |
}); | |
return results; | |
} | |