1+ // starting at s
12function solve ( graph , s ) {
2- var solution = { } ;
3+ var solutions = { } ;
34 solutions [ s ] = [ ] ;
45 solutions [ s ] . dist = 0 ;
56
67 while ( true ) {
7- var parent = null ;
8- var nearest = null ;
8+ var p = null ;
9+ var neighbor = null ;
910 var dist = Infinity ;
1011
11-
12+
1213 for ( var n in solutions ) {
1314 if ( ! solutions [ n ] )
1415 continue
1516 var ndist = solutions [ n ] . dist ;
1617 var adj = graph [ n ] ;
17- //for each of its adjacent nodes...
18+
1819 for ( var a in adj ) {
19- //without a solution already...
20+
2021 if ( solutions [ a ] )
2122 continue ;
22- //choose nearest node with lowest *total* cost
23+
2324 var d = adj [ a ] + ndist ;
2425 if ( d < dist ) {
25- //reference parent
26- parent = solutions [ n ] ;
27- nearest = a ;
26+
27+ p = solutions [ n ] ;
28+ neighbor = a ;
2829 dist = d ;
2930 }
3031 }
3132 }
3233
33-
34+ //no more solutions
3435 if ( dist === Infinity ) {
3536 break ;
3637 }
37-
38- solutions [ nearest ] = parent . concat ( nearest ) ;
39-
40- solutions [ nearest ] . dist = dist ;
38+
39+ //extend parent's solution path
40+ solutions [ neighbor ] = p . concat ( neighbor ) ;
41+ //extend parent's cost
42+ solutions [ neighbor ] . dist = dist ;
4143 }
4244
4345 return solutions ;
4446}
45-
47+ //create graph
4648var graph = { } ;
4749
48- \\create graph
49-
5050var layout = {
5151 'R' : [ '2' ] ,
5252 '2' : [ '3' , '4' ] ,
@@ -66,7 +66,6 @@ var layout = {
6666}
6767
6868//convert uni-directional to bi-directional graph
69- // needs to look like: where: { a: { b: cost of a->b }
7069// var graph = {
7170// a: {e:1, b:1, g:3},
7271// b: {a:1, c:1},
@@ -100,3 +99,20 @@ for(var s in solutions) {
10099 if ( ! solutions [ s ] ) continue ;
101100 console . log ( " -> " + s + ": [" + solutions [ s ] . join ( ", " ) + "] (dist:" + solutions [ s ] . dist + ")" ) ;
102101}
102+
103+ // From '10' to
104+ // -> 2: [7, 5, 4, 2] (dist:4)
105+ // -> 3: [7, 5, 4, 3] (dist:4)
106+ // -> 4: [7, 5, 4] (dist:3)
107+ // -> 5: [7, 5] (dist:2)
108+ // -> 6: [7, 5, 4, 3, 6] (dist:5)
109+ // -> 7: [7] (dist:1)
110+ // -> 8: [7, 5, 4, 8] (dist:4)
111+ // -> 9: [7, 5, 4, 3, 13, 14, 9] (dist:7)
112+ // -> 10: [] (dist:0)
113+ // -> 11: [7, 5, 11] (dist:3)
114+ // -> 12: [7, 5, 11, 12] (dist:4)
115+ // -> 13: [7, 5, 4, 3, 13] (dist:5)
116+ // -> 14: [7, 5, 4, 3, 13, 14] (dist:6)
117+ // -> 15: [7, 5, 4, 3, 6, 15] (dist:6)
118+ // -> R: [7, 5, 4, 2, R] (dist:5)
0 commit comments