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

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

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

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

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

textual
Листинг программы
  1. ;; Обход в ширину
  2.              
  3. ;; список вершин, связанных с данной и не посещенных            
  4.              
  5. (defun getall (v graph chk)
  6.  (remove-if #'(lambda (z) (member z chk))
  7.                  (mapcar #'(lambda (y) (if (eq (car y) v) (cadr y) (car y)))
  8.                         (remove-if-not #'(lambda (x) (member v x)) graph))))
  9.  
  10. ;; Построение каркаса            
  11.              
  12. (defun bfsi (graph &optional (chk '(1)) (queue '(1)))
  13.    (cond ((null queue) nil)
  14.          (t (let ((n (getall (car queue) graph chk)))
  15.                  (append (mapcar #'(lambda (x) (list (car queue) x)) n)
  16.                          (bfsi graph (append chk n) (append (cdr queue) n)))))))
  17.  
  18. (defun bfs (graph v)
  19.   (bfsi graph (list v) (list v)))                        
  20.  
  21. ;; Поиск пути  
  22.                  
  23. (defun find-path (stree v1 v2 &optional path)
  24.   (if (eq v1 (caar path)) path
  25.          (dolist (i stree nil)
  26.            (when (eq (cadr i) v2) (return (find-path stree v1 (car i) (cons i path)))))))
  27.      
  28. (defun shortest-path (graph vbeg vend)
  29.   (let ((stree (bfs graph vbeg)))
  30.        (find-path stree vbeg vend)))  
  31.        
  32. (shortest-path '((1 2)(1 3) (2 3) (2 4) (3 4) (3 5) (3 6) (4 6)) 1 5)
  33.  
  34. ==> ((1 3) (3 5))
  35.  
  36. (shortest-path '((1 2)(1 3) (2 3) (2 4) (3 4) (3 5) (3 6) (4 6)) 1 6)
  37.  
  38. ==> ((1 3) (3 6))
  39.  
  40. (shortest-path '((1 2)(1 3) (2 3) (2 4) (3 4) (3 5) (4 6)) 1 6)
  41.  
  42. ==> ((1 2) (2 4) (4 6))

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут