From a40b1ec187ee44c7c562136cc43a74185a3a992d Mon Sep 17 00:00:00 2001 From: Sergiu Ivanov Date: Sun, 31 Oct 2021 20:57:17 +0100 Subject: [PATCH] Add bfs/generalized. --- graph.rkt | 38 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/graph.rkt b/graph.rkt index 65e1d24..445ea85 100644 --- a/graph.rkt +++ b/graph.rkt @@ -19,7 +19,8 @@ ;;; https://stackoverflow.com/questions/65386334/racket-generic-graph-library-in-typed-racket (module graph-wrapper racket - (require (prefix-in g: graph)) + (require (prefix-in g: graph) + data/gen-queue/fifo) (provide (struct-out graph) has-vertex? has-edge? vertex=? add-vertex! remove-vertex! rename-vertex! add-edge! add-directed-edge! remove-edge! remove-directed-edge! get-vertices in-vertices get-neighbors @@ -32,7 +33,7 @@ undirected-graph directed-graph matrix-graph? - bfs fewest-vertices-path + bfs bfs/generalized fewest-vertices-path dfs dfs/generalized graphviz) @@ -115,6 +116,26 @@ ;; 4.1 Breadth-first Search (define (bfs g source) (g:bfs (gg g) source)) + (define (bfs/generalized + g + source + #:init-queue [init-queue (mk-empty-fifo)] + #:break [break? (λ (G source from to) #f)] + #:init [init void] + #:visit? [custom-visit?-fn (λ (G source from to) #f)] + #:discover [discover (λ (G s u v acc) acc)] + #:visit [visit (λ (G s v acc) acc)] + #:return [finish (λ (G s acc) acc)]) + (g:bfs/generalized + (gg g) + source + #:init-queue init-queue + #:break break? + #:init init + #:visit? custom-visit?-fn + #:discover discover + #:visit visit + #:return finish)) (define (fewest-vertices-path G source target) (g:fewest-vertices-path (gg G) source target)) @@ -201,6 +222,15 @@ ;; 4.1 Breadth-first Search [bfs (-> Graph Any (Values (Mutable-HashTable Any Number) (Mutable-HashTable Any Any)))] + [bfs/generalized (->* (Graph Any) + (#:init-queue Any ; TODO: Add a proper type. + #:break (-> Graph Any Any Any Boolean) + #:init (-> Graph Any Void) + #:visit? (-> Graph Any Any Any Boolean) + #:discover (-> Graph Any Any Any Any Any) + #:visit (-> Graph Any Any Any Any) + #:return (-> Graph Any Any Any)) + Any)] [fewest-vertices-path (-> Graph Any Any (U (Listof Any) False))] ;; 4.2 Depth-first Search @@ -301,6 +331,10 @@ (define-values (bfs-lens bfs-tree) (bfs (directed-graph '((a b) (b c))) 'a)) (check-equal? (hash->ordered-list bfs-lens) '((a . 0) (b . 1) (c . 2))) (check-equal? (hash->ordered-list bfs-tree) '((a . #f) (b . a) (c . b))) + + (check-equal? (bfs/generalized (directed-graph '((a b) (a c) (b d) (c d))) 'a) + (void)) + (check-equal? (fewest-vertices-path (directed-graph '((a b) (b c) (c d))) 'a 'd) '(a b c d))