Skip to content

Instantly share code, notes, and snippets.

@thunder775
Last active October 8, 2020 07:03
Show Gist options
  • Save thunder775/7bee15cad958f3e0fdb9287daecf7056 to your computer and use it in GitHub Desktop.
Save thunder775/7bee15cad958f3e0fdb9287daecf7056 to your computer and use it in GitHub Desktop.
function getAllPossiblePaths(paths = [[]], source, target) {
let result = [];
let connectingPaths = paths.filter(([s1, s2, dist]) => s1 === source || s2 === source).map(([s1, s2, dist]) => [source, s1 === source ? s2 : s1, dist]);
if (connectingPaths.length === 0) {
return [];
}
for (let [src, tgt, dist] of connectingPaths) {
paths = paths.filter(([s1, s2, target]) => !((s1 === src && s2 === tgt) || (s1 === tgt && s2 === src)));
if (tgt === target) {
result.push([[src, tgt, dist]])
} else {
let subPaths = getAllPossiblePaths(paths, tgt, target);
let temp = [];
for (let path of subPaths) {
if (path.length !== 0) {
path.unshift([src, tgt, dist]);
result.push(path)
}
}
if (temp.length !== 0) result.push(temp)
}
}
return result;
}
function navigate(roads, source, target) {
let edgesArray = roads.graph.edges.map(edge=>[edge.source, edge.target, edge.metadata.distance]);
let possiblePaths = getAllPossiblePaths(edgesArray, source, target);
let organisedPaths = [];
for (let path of possiblePaths) {
let nodes = new Set();
let distance = 0;
for (let [src, target, dist] of path) {
nodes.add(src);
nodes.add(target);
distance += dist;
}
organisedPaths.push({
distance: distance,
path: Array.from(nodes.keys())
})
}
return organisedPaths.reduce((a, b) => {
return (b.distance - a.distance) > 0 ? a : b
})
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment