Spaces:
Build error
Build error
| import * as _ from 'lodash-es'; | |
| import { PriorityQueue } from '../data/priority-queue.js'; | |
| export { dijkstra }; | |
| var DEFAULT_WEIGHT_FUNC = _.constant(1); | |
| function dijkstra(g, source, weightFn, edgeFn) { | |
| return runDijkstra( | |
| g, | |
| String(source), | |
| weightFn || DEFAULT_WEIGHT_FUNC, | |
| edgeFn || | |
| function (v) { | |
| return g.outEdges(v); | |
| } | |
| ); | |
| } | |
| function runDijkstra(g, source, weightFn, edgeFn) { | |
| var results = {}; | |
| var pq = new PriorityQueue(); | |
| var v, vEntry; | |
| var updateNeighbors = function (edge) { | |
| var w = edge.v !== v ? edge.v : edge.w; | |
| var wEntry = results[w]; | |
| var weight = weightFn(edge); | |
| var distance = vEntry.distance + weight; | |
| if (weight < 0) { | |
| throw new Error( | |
| 'dijkstra does not allow negative edge weights. ' + | |
| 'Bad edge: ' + | |
| edge + | |
| ' Weight: ' + | |
| weight | |
| ); | |
| } | |
| if (distance < wEntry.distance) { | |
| wEntry.distance = distance; | |
| wEntry.predecessor = v; | |
| pq.decrease(w, distance); | |
| } | |
| }; | |
| g.nodes().forEach(function (v) { | |
| var distance = v === source ? 0 : Number.POSITIVE_INFINITY; | |
| results[v] = { distance: distance }; | |
| pq.add(v, distance); | |
| }); | |
| while (pq.size() > 0) { | |
| v = pq.removeMin(); | |
| vEntry = results[v]; | |
| if (vEntry.distance === Number.POSITIVE_INFINITY) { | |
| break; | |
| } | |
| edgeFn(v).forEach(updateNeighbors); | |
| } | |
| return results; | |
| } | |