(Dijkstra) stop pathfinder when the closest unseen node has a distance greater or equal to most-positive-fixnum

master
y5nw 2021-08-23 14:54:52 +02:00
parent 94c136c29c
commit 8d8bfacb75
1 changed files with 9 additions and 7 deletions

View File

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