Data update
This commit is contained in:
parent
ed705008a8
commit
0df55f9f24
2196 changed files with 32999 additions and 3075 deletions
|
|
@ -0,0 +1,84 @@
|
|||
BEGIN # Floyd-Warshall algorithm - translated from the Lua sample #
|
||||
|
||||
OP FMT = ( REAL v )STRING:
|
||||
BEGIN
|
||||
STRING result := fixed( ABS v, 0, 15 );
|
||||
IF result[ LWB result ] = "." THEN "0" +=: result FI;
|
||||
WHILE result[ UPB result ] = "0" DO result := result[ : UPB result - 1 ] OD;
|
||||
IF result[ UPB result ] = "." THEN result := result[ : UPB result - 1 ] FI;
|
||||
IF v < 0 THEN "-" ELSE " " FI + result
|
||||
END # FMT # ;
|
||||
|
||||
PROC print result = ( [,]REAL dist, [,]INT nxt )VOID:
|
||||
BEGIN
|
||||
print( ( "pair dist path", newline ) );
|
||||
FOR i FROM 1 LWB nxt TO 1 UPB nxt DO
|
||||
FOR j FROM 2 LWB nxt TO 2 UPB nxt DO
|
||||
IF i /= j THEN
|
||||
INT u := i + 1;
|
||||
INT v = j + 1;
|
||||
print( ( whole( u, 0 ), " -> ", whole( v, 0 ), " "
|
||||
, FMT dist[ i, j ], " ", whole( u, 0 )
|
||||
)
|
||||
);
|
||||
WHILE u := nxt[ u - 1, v - 1 ];
|
||||
print( ( " -> " +whole( u, 0 ) ) );
|
||||
u /= v
|
||||
DO SKIP OD;
|
||||
print( ( newline ) )
|
||||
FI
|
||||
OD
|
||||
OD
|
||||
END # print result # ;
|
||||
|
||||
PROC floyd warshall = ( [,]INT weights, INT num vertices )VOID:
|
||||
BEGIN
|
||||
|
||||
REAL infinity = max real;
|
||||
|
||||
[ 0 : num vertices - 1, 0 : num vertices - 1 ]REAL dist;
|
||||
FOR i FROM LWB dist TO 1 UPB dist DO
|
||||
FOR j FROM 2 LWB dist TO 2 UPB dist DO
|
||||
dist[ i, j ] := infinity
|
||||
OD
|
||||
OD;
|
||||
|
||||
FOR i FROM 1 LWB weights TO 1 UPB weights DO
|
||||
# the weights array is one based #
|
||||
[]INT w = weights[ i, : ];
|
||||
dist[ w[ 1 ] - 1, w[ 2 ] - 1 ] := w[ 3 ]
|
||||
OD;
|
||||
|
||||
[ 0 : num vertices - 1, 0 : num vertices - 1 ]INT nxt;
|
||||
FOR i FROM LWB nxt TO 1 UPB nxt DO
|
||||
FOR j FROM 2 LWB nxt TO 2 UPB nxt DO
|
||||
nxt[ i, j ] := IF i /= j THEN j + 1 ELSE 0 FI
|
||||
OD
|
||||
OD;
|
||||
|
||||
FOR k FROM 2 LWB dist TO 2 UPB dist DO
|
||||
FOR i FROM 1 LWB dist TO 1 UPB dist DO
|
||||
FOR j FROM 2 LWB dist TO 2 UPB dist DO
|
||||
IF dist[ i, k ] /= infinity AND dist[ k, j ] /= infinity THEN
|
||||
IF dist[ i, k ] + dist[ k, j ] < dist[ i, j ] THEN
|
||||
dist[ i, j ] := dist[ i, k ] + dist[ k, j ];
|
||||
nxt[ i, j ] := nxt[ i, k ]
|
||||
FI
|
||||
FI
|
||||
OD
|
||||
OD
|
||||
OD;
|
||||
|
||||
print result( dist, nxt )
|
||||
END # floyd warshall # ;
|
||||
|
||||
[,]INT weights = ( ( 1, 3, -2 )
|
||||
, ( 2, 1, 4 )
|
||||
, ( 2, 3, 3 )
|
||||
, ( 3, 4, 2 )
|
||||
, ( 4, 2, -1 )
|
||||
);
|
||||
INT num vertices = 4;
|
||||
floyd warshall( weights, num vertices )
|
||||
|
||||
END
|
||||
|
|
@ -1,21 +1,49 @@
|
|||
var graph = [];
|
||||
for (i = 0; i < 10; ++i) {
|
||||
'use strict'
|
||||
let numVertices = 4;
|
||||
let weights = [ [ 1, 3, -2 ], [ 2, 1, 4 ], [ 2, 3, 3 ], [ 3, 4, 2 ], [ 4, 2, -1 ] ];
|
||||
|
||||
let graph = [];
|
||||
for (let i = 0; i < numVertices; ++i) {
|
||||
graph.push([]);
|
||||
for (j = 0; j < 10; ++j)
|
||||
for (let j = 0; j < numVertices; ++j)
|
||||
graph[i].push(i == j ? 0 : 9999999);
|
||||
}
|
||||
|
||||
for (i = 1; i < 10; ++i) {
|
||||
graph[0][i] = graph[i][0] = parseInt(Math.random() * 9 + 1);
|
||||
for (let i = 0; i < weights.length; ++i) {
|
||||
let w = weights[i];
|
||||
graph[w[0] - 1][w[1] - 1] = w[2];
|
||||
}
|
||||
|
||||
for (k = 0; k < 10; ++k) {
|
||||
for (i = 0; i < 10; ++i) {
|
||||
for (j = 0; j < 10; ++j) {
|
||||
if (graph[i][j] > graph[i][k] + graph[k][j])
|
||||
graph[i][j] = graph[i][k] + graph[k][j]
|
||||
let nxt = [];
|
||||
for (let i = 0; i < numVertices; ++i) {
|
||||
nxt.push([]);
|
||||
for (let j = 0; j < numVertices; ++j)
|
||||
nxt[i].push(i == j ? 0 : j + 1);
|
||||
}
|
||||
|
||||
for (let k = 0; k < numVertices; ++k) {
|
||||
for (let i = 0; i < numVertices; ++i) {
|
||||
for (let j = 0; j < numVertices; ++j) {
|
||||
if (graph[i][j] > graph[i][k] + graph[k][j]) {
|
||||
graph[i][j] = graph[i][k] + graph[k][j];
|
||||
nxt[i][j] = nxt[i][k];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
console.log(graph);
|
||||
console.log("pair dist path");
|
||||
for (let i = 0; i < numVertices; ++i) {
|
||||
for (let j = 0; j < numVertices; ++j) {
|
||||
if (i != j) {
|
||||
let u = i + 1;
|
||||
let v = j + 1;
|
||||
let path = u + " -> " + v + " " + graph[i][j].toString().padStart(2) + " " + u;
|
||||
do {
|
||||
u = nxt[u - 1][v - 1];
|
||||
path = path + " -> " + u;
|
||||
} while (u != v);
|
||||
console.log(path)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,50 @@
|
|||
import java.lang.String.format;
|
||||
|
||||
object FloydWarshall extends App {
|
||||
|
||||
val weights = Array(Array(1, 3, -2), Array(2, 1, 4), Array(2, 3, 3), Array(3, 4, 2), Array(4, 2, -1))
|
||||
val numVertices = 4
|
||||
|
||||
floydWarshall(weights, numVertices)
|
||||
|
||||
def floydWarshall(weights: Array[Array[Int]], numVertices: Int): Unit = {
|
||||
|
||||
val dist = Array.fill(numVertices, numVertices)(Double.PositiveInfinity)
|
||||
for (w <- weights)
|
||||
dist(w(0) - 1)(w(1) - 1) = w(2)
|
||||
|
||||
val next = Array.ofDim[Int](numVertices, numVertices)
|
||||
for (i <- 0 until numVertices; j <- 0 until numVertices if i != j)
|
||||
next(i)(j) = j + 1
|
||||
|
||||
for {
|
||||
k <- 0 until numVertices
|
||||
i <- 0 until numVertices
|
||||
j <- 0 until numVertices
|
||||
if dist(i)(k) + dist(k)(j) < dist(i)(j)
|
||||
} {
|
||||
dist(i)(j) = dist(i)(k) + dist(k)(j)
|
||||
next(i)(j) = next(i)(k)
|
||||
}
|
||||
|
||||
printResult(dist, next)
|
||||
}
|
||||
|
||||
def printResult(dist: Array[Array[Double]], next: Array[Array[Int]]): Unit = {
|
||||
println("pair dist path")
|
||||
for {
|
||||
i <- 0 until next.length
|
||||
j <- 0 until next.length if i != j
|
||||
} {
|
||||
var u = i + 1
|
||||
val v = j + 1
|
||||
var path = format("%d -> %d %2d %s", u, v,
|
||||
(dist(i)(j)).toInt, u);
|
||||
while (u != v) {
|
||||
u = next(u - 1)(v - 1)
|
||||
path += s" -> $u"
|
||||
}
|
||||
println(path)
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue