Получить реберный список графа на лиспе - Lisp
Формулировка задачи:
Помогите решить задачу, в вузе очень плохо объясняют почему-то именно этот предмет, а спрашивают жестко: "Граф задан с помощью списков. Построить его реберный граф". с комментами, если можно конечно, как работает прога.
работующей проги работающей программы сделайте пожалуйста с этим деревом:
https://upload.wikimedia.org/wikiped...y_tree.svg.png
Заранее спасибо.
Примечание : пусть задан граф G, тогда его
рёберный граф
L(G) —это такой граф
, что две вершины графа L(G) смежны тогда и только тогда, когда их соответствующие рёбра имеют общую вершину («смежны») в G. ПримерРешение задачи: «Получить реберный список графа на лиспе»
textual
Листинг программы
;; Вспомогательная функция, проверяющая, имеют ли два ;; несовпадающих ребра общую вершину (defun has-common-vertex (p1 p2) (and (not (equal p1 p2)) (or (member (car p1) p2) (member (cadr p1) p2)))) ;; Построение реберного графа (defun edge-graph (graph) (let ((e-g nil)) ;; здесь будет результат (dolist (e1 graph nil) ;; пробег по всем парам ребер (dolist (e2 graph nil) ;; графа (when (and (has-common-vertex e1 e2) ;; если пара имеет общую вершину (not (member (list e1 e2) e-g)) ;; и еще не присутствует в реберном графе (not (member (list e2 e1) e-g))) (push (list e1 e2) e-g)))) (renum e-g graph))) ;; добавим ее туда ;; Перенумерация (defun renum (e-g graph) (mapcar (lambda (r) (list (+ 1 (position (car r) graph)) (+ 1 (position (cadr r) graph)))) e-g)) (edge-graph '((1 2) (1 3) (2 3) (3 4))) ;; граф с последней картинки ==> ((3 4) (2 4) (2 3) (1 3) (1 2)) ;; реберный граф
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д