|
1 | 1 | function FloydWarshall() { |
2 | | - // Finds the shortest path between all nodes |
3 | | - var S = new Array(G.length); |
4 | | - for (var i = 0; i < G.length; i++) S[i] = new Array(G.length) |
| 2 | + // Finds the shortest path between all nodes |
| 3 | + var S = new Array(G.length); |
| 4 | + for (var i = 0; i < G.length; i++) S[i] = new Array(G.length) |
| 5 | + for (i = 0; i < G.length; i++) { |
| 6 | + for (var j = 0; j < G.length; j++) { |
| 7 | + // Distance to self is always 0 |
| 8 | + if (i == j) S[i][i] = 0; |
| 9 | + // Distance between connected nodes is their weight |
| 10 | + else if (G[i][j] > 0) { |
| 11 | + S[i][j] = G[i][j]; |
| 12 | + }// Else we don't know the distance and we set it to infinity |
| 13 | + else S[i][j] = MAX_VALUE; |
| 14 | + } |
| 15 | + } |
| 16 | + // If there is a shorter path using k, use it instead |
| 17 | + for (var k = 0; k < G.length; k++) { |
5 | 18 | for (i = 0; i < G.length; i++) { |
6 | | - tracer._visit(i)._wait(); |
7 | | - for (var j = 0; j < G.length; j++) { |
8 | | - // Distance to self is always 0 |
9 | | - if (i == j) S[i][i] = 0; |
10 | | - // Distance between connected nodes is their weight |
11 | | - else if (G[i][j] > 0) { |
12 | | - S[i][j] = G[i][j]; |
13 | | - tracer._visit(j, i, S[i][j])._wait(); |
14 | | - tracer._leave(j, i, S[i][j])._wait(); |
15 | | - }// Else we don't know the distance and we set it to infinity |
16 | | - else S[i][j] = MAX_VALUE; |
| 19 | + if (k == i) continue; |
| 20 | + tracer._visit(k, i)._wait(); |
| 21 | + for (j = 0; j < G.length; j++) { |
| 22 | + if (i == j || j == k) continue; |
| 23 | + tracer._visit(j, k)._wait(); |
| 24 | + if (S[i][j] > S[i][k] + S[k][j]) { |
| 25 | + tracer._visit(j, i, S[i][j])._wait(); |
| 26 | + S[i][j] = S[i][k] + S[k][j]; |
| 27 | + tracer._leave(j, i, S[i][j]); |
17 | 28 | } |
18 | | - tracer._leave(i)._wait(); |
| 29 | + tracer._leave(j, k); |
| 30 | + } |
| 31 | + tracer._leave(k, i)._wait(); |
19 | 32 | } |
20 | | - // If there is a shorter path using k, use it instead |
21 | | - for (var k = 0; k < G.length; k++) |
22 | | - for (i = 0; i < G.length; i++) |
23 | | - for (j = 0; j < G.length; j++) |
24 | | - if (S[i][j] > S[i][k] + S[k][j]) |
25 | | - S[i][j] = S[i][k] + S[k][j]; |
26 | | - for (i = 0; i < G.length; i++) |
27 | | - for (j = 0; j < G.length; j++) |
28 | | - if (S[i][j] == MAX_VALUE) logger._print('there is no path from ' + i + ' to ' + j); |
29 | | - else logger._print('the shortest path from ' + i + |
30 | | - ' to ' + j + ' is ' + S[i][j]); |
| 33 | + } |
| 34 | + for (i = 0; i < G.length; i++) |
| 35 | + for (j = 0; j < G.length; j++) |
| 36 | + if (S[i][j] == MAX_VALUE) logger._print('there is no path from ' + i + ' to ' + j); |
| 37 | + else logger._print('the shortest path from ' + i + ' to ' + j + ' is ' + S[i][j]); |
31 | 38 | } |
32 | 39 | var MAX_VALUE = Infinity; |
33 | 40 | logger._print('finding the shortest paths from and to all nodes'); |
|
0 commit comments