function dijkstra(pts) {
const Q = new Set();
const dist = new Map();
const prev = new Map();
const prevEdge = new Map();
pts.forEach(pt => {
dist.set(pt, Infinity);
prev.set(pt, undefined);
Q.add(pt);
});
dist.set(pts[0], 0);
while (Q.size) {
let u, minDistance = Infinity;
for (const candidate of Q) {
if (dist.get(candidate) < minDistance) {
minDistance = dist.get(candidate);
u = candidate;
}
}
Q.delete(u);
for (const edge of u.edges) {
const v = edge.source === u ? edge.target : edge.source;
const alt = dist.get(u) + edge.distance;
if (alt < dist.get(v)) {
dist.set(v, alt);
prev.set(v, u);
prevEdge.set(v, edge);
}
}
}
return {dist, prev, prevEdge};
}