Skip to content

Commit 5b3cfc8

Browse files
committed
improve floyd
1 parent 8b5ab74 commit 5b3cfc8

File tree

2 files changed

+34
-34
lines changed

2 files changed

+34
-34
lines changed

algorithm/graph_search/floyd_warshall/shortest_paths/code.js

Lines changed: 33 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,40 @@
11
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++) {
518
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]);
1728
}
18-
tracer._leave(i)._wait();
29+
tracer._leave(j, k);
30+
}
31+
tracer._leave(k, i)._wait();
1932
}
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]);
3138
}
3239
var MAX_VALUE = Infinity;
3340
logger._print('finding the shortest paths from and to all nodes');
Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,5 @@
11
var tracer = new WeightedDirectedGraphTracer();
22
var logger = new LogTracer();
33
tracer.attach(logger);
4-
/*var G = [ // G[i][j] indicates the weight of the path from the i-th node to the j-th node
5-
[0, 3, 0, 1, 0],
6-
[5, 0, 1, 2, 4],
7-
[1, 0, 0, 2, 0],
8-
[0, 2, 0, 0, 1],
9-
[0, 1, 3, 0, 0]
10-
];*/
11-
var G = WeightedDirectedGraph.random(10, .4, 1, 9);
4+
var G = WeightedDirectedGraph.random(5, 1, 1, 9);
125
tracer._setData(G);

0 commit comments

Comments
 (0)