(Dijkstra) stop pathfinder when the closest unseen node has a distance greater or equal to most-positive-fixnum
parent
94c136c29c
commit
8d8bfacb75
|
@ -18,13 +18,15 @@
|
|||
for d = (gethash ts dist)
|
||||
when (<= d dst) do (psetf dst d trackside ts))
|
||||
(values trackside dst))))
|
||||
(loop while (> (hash-table-count unknown) 0) do
|
||||
(multiple-value-bind (u d) (shortest-unseen)
|
||||
(remhash u unknown)
|
||||
(loop for (v . len) in (direct-next tdb u t) for alt = (+ d len)
|
||||
when (< alt (gethash v dist)) do
|
||||
(setf (gethash v dist) alt)
|
||||
(setf (gethash v prev) u)))))
|
||||
(loop with contp = t while (and (> (hash-table-count unknown) 0) contp)
|
||||
do (multiple-value-bind (u d) (shortest-unseen)
|
||||
(remhash u unknown)
|
||||
(if (>= d most-positive-fixnum)
|
||||
(setf contp nil)
|
||||
(loop for (v . len) in (direct-next tdb u t) for alt = (+ d len)
|
||||
when (< alt (gethash v dist)) do
|
||||
(setf (gethash v dist) alt)
|
||||
(setf (gethash v prev) u))))))
|
||||
(let ((path nil) (distance (gethash to dist)))
|
||||
(loop for i = to then (gethash i prev) while i do (push i path))
|
||||
(values (if (equalp (car path) from) path nil) distance))))
|
||||
|
|
Loading…
Reference in New Issue