+(defgeneric rooted-dfs (graph root fn &key out-edge-sorter)
+ (:documentation "A variant of DFS that does not visit nodes that are
+unreachable from the ROOT.")
+ (:method ((graph basic-graph) (root t) fn &key
+ (out-edge-sorter #'edge-lessp-by-direction))
+ (rooted-dfs graph (find-vertex graph root) fn :out-edge-sorter out-edge-sorter))
+ (:method ((graph basic-graph) (root basic-vertex) fn &key
+ (out-edge-sorter #'edge-lessp-by-direction))
+ (setf *depth-first-search-timer* -1)
+
+ (iterate-vertexes
+ graph
+ (lambda (v)
+ (setf (color v) :white
+ (previous-node v) nil
+ (discovery-time v) -1
+ (finish-time v) -1)))
+
+ (iterate-edges
+ graph
+ (lambda (e)
+ (setf (color e) nil)))
+
+ (dfs-visit graph root fn out-edge-sorter)
+
+ (values
+ (sort (remove-if #'(lambda (v) (eq (color v) :white))
+ (vertexes graph))
+ #'< :key #'finish-time)
+ graph)))
+