Dijkstra's algorithm: Difference between revisions

Content deleted Content added
Line 1,354: Line 1,354:
(d (d e . 6))
(d (d e . 6))
(e (e f . 9))))
(e (e f . 9))))
(defvar *r* nil)
(defvar *r* nil)

(defun dijkstra-short-path (i g)
(defun dijkstra-short-path (i g)
(setf *r* nil) (paths i g 0 `(,i))
(setf *r* nil) (paths i g 0 `(,i))
(car (sort *r* #'< :key #'cadr)))
(car (sort *r* #'< :key #'cadr)))

(defun paths (c g &optional (z 0) v)
(defun paths (c g z v)
(if (eql c g) (push `(,(reverse v) ,z) *r*)
(if (eql c g) (push `(,(reverse v) ,z) *r*)
(loop for a in (nodes c) do
(loop for a in (nodes c) do
Line 1,367: Line 1,367:
(paths (cadr a) g (+ (cddr a) z)
(paths (cadr a) g (+ (cddr a) z)
(cons (cadr a) v))))))
(cons (cadr a) v))))))
(defun nodes (c)
(defun nodes (c)
(sort (cdr (assoc c *w*)) #'< :key #'cddr))
(sort (cdr (assoc c *w*)) #'< :key #'cddr))