;;; Paths from one node to another ;;; uses adjacency-list form (defun path (g a b) (path-using g a b (all-nodes g)) ) (defun path-using (g a b available) (if (equal a b) (list (list a)) (let ((path-list nil)) (dolist (n (adj-list g a) (addto a path-list)) (if (member n available) (setf path-list (append (path-using g n b (remove a available)) path-list) ) ) ) ) ) ) (defun adj-list (g a) (second (assoc a g)) ) (defun addto (a paths) (mapcar #'(lambda (x) (cons a x)) paths) ) (defun all-nodes (g) (mapcar #'car g) )