| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- var _ = require('../lodash')
- module.exports = 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) {
- const results = {}
- const 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) {
- const w = edge.v === v ? edge.w : edge.v
- const 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
- }
|