// starting at s function solve (graph, s) { var solutions = {} solutions[s] = [] solutions[s].dist = 0 while (true) { var p = null var neighbor = null var dist = Infinity for (var n in solutions) { if (!solutions[n]) { continue } var ndist = solutions[n].dist var adj = graph[n] for (var a in adj) { if (solutions[a]) { continue } var d = adj[a] + ndist if (d < dist) { p = solutions[n] neighbor = a dist = d } } } // no more solutions if (dist === Infinity) { break } // extend parent's solution path solutions[neighbor] = p.concat(neighbor) // extend parent's cost solutions[neighbor].dist = dist } return solutions } // create graph var graph = {} var layout = { R: ['2'], 2: ['3', '4'], 3: ['4', '6', '13'], 4: ['5', '8'], 5: ['7', '11'], 6: ['13', '15'], 7: ['10'], 8: ['11', '13'], 9: ['14'], 10: [], 11: ['12'], 12: [], 13: ['14'], 14: [], 15: [] } // convert uni-directional to bi-directional graph // var graph = { // a: {e:1, b:1, g:3}, // b: {a:1, c:1}, // c: {b:1, d:1}, // d: {c:1, e:1}, // e: {d:1, a:1}, // f: {g:1, h:1}, // g: {a:3, f:1}, // h: {f:1} // }; for (var id in layout) { if (!graph[id]) { graph[id] = {} } layout[id].forEach(function (aid) { graph[id][aid] = 1 if (!graph[aid]) { graph[aid] = {} } graph[aid][id] = 1 }) } // choose start node var start = '10' // get all solutions var solutions = solve(graph, start) console.log("From '" + start + "' to") // display solutions for (var s in solutions) { if (!solutions[s]) continue console.log(' -> ' + s + ': [' + solutions[s].join(', ') + '] (dist:' + solutions[s].dist + ')') } // From '10' to // -> 2: [7, 5, 4, 2] (dist:4) // -> 3: [7, 5, 4, 3] (dist:4) // -> 4: [7, 5, 4] (dist:3) // -> 5: [7, 5] (dist:2) // -> 6: [7, 5, 4, 3, 6] (dist:5) // -> 7: [7] (dist:1) // -> 8: [7, 5, 4, 8] (dist:4) // -> 9: [7, 5, 4, 3, 13, 14, 9] (dist:7) // -> 10: [] (dist:0) // -> 11: [7, 5, 11] (dist:3) // -> 12: [7, 5, 11, 12] (dist:4) // -> 13: [7, 5, 4, 3, 13] (dist:5) // -> 14: [7, 5, 4, 3, 13, 14] (dist:6) // -> 15: [7, 5, 4, 3, 6, 15] (dist:6) // -> R: [7, 5, 4, 2, R] (dist:5)