Единственное, что мне удалось сделать, так это написать алгоритм нахождения гамильтонова цикла (т.е. прохождение через все города только по одному разуи возвращение в исходный город). Методом поиска в глубину с возвратом. Но я не знаю, будет ли это кратчайший путь и как вычислять пройденный путь (надо как-то добавить еще алгоритм?).
(DEFUN HAMILTCYCLE (LAMBDA (GRAPH)
; GRAPH - граф в виде структуры смежности ;
; Результат: гамильтонов цикл в виде списка вершин, ;
; NIL - если гамильтонова цикла не существует ;
(COND ( (NULL GRAPH) NIL )
( T (COND ( (NULL (CDR GRAPH))
(LIST (CAAR GRAPH)))
( T (HC GRAPH (CAAR GRAPH)
(LIST (CAAR GRAPH))
(CDAR GRAPH)
)
)
)
)
)
))
; ---------------------------------------- ;
(DEFUN HC (LAMBDA (GRAPH START VISITED SONS)
; START - первая вершина графа ;
; VISITED - список пройденных вершин ;
; SONS - соседи просматриваемой вершины ;
(COND ( (NULL SONS) NIL )
( T (COND ( (AND (MEMBER START SONS)
(EQ (LENGTH GRAPH)
(LENGTH VISITED))
)
(REVERSE VISITED)
)
( T (COND
( (MEMBER (CAR SONS) VISITED)
(HC GRAPH START VISITED
(CDR SONS)) )
( T (OR (HC GRAPH START
(CONS
(CAR SONS)
VISITED)
(NEIGHBOUR3
(CAR SONS)
GRAPH)
)
(HC
GRAPH START VISITED
(CDR SONS))) )) )
)
)
)
))
; ------------------------------- ;
(DEFUN NEIGHBOUR3 (LAMBDA (X GRAPH)
(COND ( (NULL (ASSOC X GRAPH)) NIL )
( T (CDR (ASSOC X GRAPH)) )
)
))
Пример:
$ (HAMILTCYCLE '((1 . (2 6)) (2 . (1 3 4)) (3 . (2 4))
(4 . (2 3 5)) (5 . (4 6)) (6 . (1 5))))
(1 2 3 4 5 6)
Помогите находить наименьший путь (и его длину)!!!!