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 |
(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)) |