Задача про граф - Lisp

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, помогите пожалуйста решить задачу. Описать данную функцию, выполняющую обработку. Граф задан парами (a b) (из a можно попасть в b). Найти последовательность перемещений из начальной вершины в заданную.

Решение задачи: «Задача про граф»

textual
Листинг программы
;; Обход в ширину
             
;; список вершин, связанных с данной и не посещенных             
             
(defun getall (v graph chk) 
 (remove-if #'(lambda (z) (member z chk))
                 (mapcar #'(lambda (y) (if (eq (car y) v) (cadr y) (car y))) 
                        (remove-if-not #'(lambda (x) (member v x)) graph))))
  
;; Построение каркаса             
             
(defun bfsi (graph &optional (chk '(1)) (queue '(1)))
   (cond ((null queue) nil)
         (t (let ((n (getall (car queue) graph chk)))
                 (append (mapcar #'(lambda (x) (list (car queue) x)) n)
                         (bfsi graph (append chk n) (append (cdr queue) n)))))))
 
(defun bfs (graph v)
  (bfsi graph (list v) (list v)))                         
 
;; Поиск пути  
                 
(defun find-path (stree v1 v2 &optional path)
  (if (eq v1 (caar path)) path
         (dolist (i stree nil)
           (when (eq (cadr i) v2) (return (find-path stree v1 (car i) (cons i path)))))))
      
(defun shortest-path (graph vbeg vend)
  (let ((stree (bfs graph vbeg)))
       (find-path stree vbeg vend)))  
       
(shortest-path '((1 2)(1 3) (2 3) (2 4) (3 4) (3 5) (3 6) (4 6)) 1 5)
 
==> ((1 3) (3 5))
 
(shortest-path '((1 2)(1 3) (2 3) (2 4) (3 4) (3 5) (3 6) (4 6)) 1 6)
 
==> ((1 3) (3 6))
 
(shortest-path '((1 2)(1 3) (2 3) (2 4) (3 4) (3 5) (4 6)) 1 6)
 
==> ((1 2) (2 4) (4 6))

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.909 из 5