(in-package cl-graph) (defun foo () (let ((graph (cl-graph:make-graph 'cl-graph:graph-container :vertex-test #'equal))) (cl-graph:add-vertex graph "a") (cl-graph:add-vertex graph "b") (cl-graph:add-vertex graph "c") (cl-graph:add-vertex graph "d") (cl-graph:add-vertex graph "e") (cl-graph:add-edge-between-vertexes graph "a" "b" :edge-type :directed) (cl-graph:add-edge-between-vertexes graph "b" "c" :edge-type :directed) (cl-graph:add-edge-between-vertexes graph "c" "a" :edge-type :directed) (cl-graph:add-edge-between-vertexes graph "d" "e" :edge-type :directed) graph)) (loop for component in (cl-graph:find-connected-components (foo)) for index from 1 do (format t "~&Component ~D (~d node~:p and ~d edge~:p)" index (vertex-count component) (edge-count component)) (iterate-edges component (lambda (edge) (format t "~& ~a to ~a" (source-vertex edge) (target-vertex edge)))) (format t "~%")) (defun mk-graph () (let ((graph (cl-graph:make-graph 'cl-graph:graph-container :vertex-test #'equal))) (cl-graph:add-vertex graph "a") (cl-graph:add-vertex graph "b") (cl-graph:add-vertex graph "c") (cl-graph:add-vertex graph "d") (cl-graph:add-vertex graph "e") (cl-graph:add-edge-between-vertexes graph "a" "b" :edge-type :directed) (cl-graph:add-edge-between-vertexes graph "b" "c" :edge-type :directed) (cl-graph:add-edge-between-vertexes graph "c" "a" :edge-type :directed) (cl-graph:add-edge-between-vertexes graph "d" "e" :edge-type :directed) graph)) (mk-graph) (setf *g* (mk-graph)) (mapcar (lambda (v) (list v (cl-graph:in-cycle-p *g* v))) (cl-graph:vertexes *g*)) (car (cl-graph:vertexes *g*))