diff --git a/graph.rkt b/graph.rkt index a33d494..016f73b 100644 --- a/graph.rkt +++ b/graph.rkt @@ -40,7 +40,7 @@ min-st-kruskal max-st-kruskal min-st-prim max-st-prim bellman-ford dijkstra dag-shortest-paths - floyd-warshall transitive-closure + floyd-warshall transitive-closure johnson graphviz) @@ -210,6 +210,8 @@ (g:floyd-warshall (gg g))) (define (transitive-closure g) (g:transitive-closure (gg g))) + (define (johnson g) + (g:johnson (gg g))) ;; 10 Graphviz (define (graphviz g #:output [output #f] #:colors [colors #f]) @@ -313,6 +315,7 @@ ;; 7 All-pairs Shortest Paths [floyd-warshall (-> Graph (Mutable-HashTable (List Any Any) Number))] [transitive-closure (-> Graph (Mutable-HashTable (List Any Any) Boolean))] + [johnson (-> Graph (Mutable-HashTable (List Any Any) Number))] ;; 10 Graphviz [graphviz (->* (Graph) @@ -495,7 +498,25 @@ ((b d) . #t) ((b b) . #t) ((d b) . #f) - ((a b) . #t)))) + ((a b) . #t))) + + (check-equal? (hash->ordered-list (johnson g0)) + '(((a d) . 4) + ((c c) . 0) + ((b a) . +inf.0) + ((a a) . 0) + ((d c) . +inf.0) + ((a c) . 2) + ((c b) . +inf.0) + ((d d) . 0) + ((c a) . +inf.0) + ((b c) . +inf.0) + ((d a) . +inf.0) + ((c d) . 3) + ((b d) . 3) + ((b b) . 0) + ((d b) . +inf.0) + ((a b) . 1)))) (test-case "10 Graphviz" (define g (directed-graph '((a b) (b c))))