Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 18.05.2017
Сообщений: 2

Существует ли путь между двумя вершинами графа

18.05.2017, 22:52. Показов 2441. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача звучит так:
"Граф задан с помощью цепных списков. Определить, существует ли путь между двумя заданными вершинами."

Я граф представляю в таком виде: ((2 3) (1) (1)) - то есть, в каждом элементе списка перечисляю числа вершин, с которыми соединена вершина с порядковым номером данного элемента в списке.

Мой код:
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
(defun find (A B L)
 (cond
   ((null L) nil)
   ((EQ A B) nil)
   (T (cond
       ((member B (nth A L)) T)
       (T (let (S A) (F A B L S)))
      )
   )
 )
)
 
(defun F (X B L S)
 (dolist (i (nth X L) 'ok)
             (cond
               ((null L) nil)
               ((member i S) nil)
               ((member B (nth i L)) T)
               (T (AND (cons i S) (F i B L S)))
             )
 )
)
По моей задумке, должен быть совершён проход по всем ответвлениям до тех пор, пока либо не найдётся вторая вершина, либо не окажется, что проверять больше нечего (сохраняю номера пройденных вершин в список S и каждый раз проверяю, не была ли уже проверена эта вершина).
Проблема в том, что при попытке проверить работу программы ошибка выдаётся уже на этапе считывания аргументов:
Lisp
1
2
CL-USER> (find 2 3 '((2 3) (1) (1)))
; Evaluation aborted on #<CCL::SIMPLE-PROGRAM-ERROR #x2100B89C5D>.
Кликните здесь для просмотра всего текста

Incorrect keyword arguments in (((2 3) (1) (1))) .
[Condition of type CCL::SIMPLE-PROGRAM-ERROR]

Restarts:
0: [RETRY] Retry SLIME REPL evaluation request.
1: [*ABORT] Return to SLIME's top level.
2: [ABORT-BREAK] Reset this thread
3: [ABORT] Kill this thread

Backtrace:
0: (NIL #<Unknown Arguments>)
1: (CCL::CALL-CHECK-REGS FIND 2 3 ((2 3) (1) (1)))
2: (CCL::CHEAP-EVAL (FIND 2 3 '((2 3) (1) (1))))
3: (SWANK::EVAL-REGION "(find 2 3 '((2 3) (1) (1)))\n")
Locals:
STRING = "(find 2 3 '((2 3) (1) (1)))\n"
STREAM = #<STRING-INPUT-STREAM #x2100B89F4D>
VALUES = NIL
- = (FIND 2 3 '((2 3) (1) (1)))
SWANK::FORM = (FIND 2 3 '((2 3) (1) (1)))
4: ((:INTERNAL SWANK::REPL-EVAL))
5: (SWANK::TRACK-PACKAGE #<CCL:COMPILED-LEXICAL-CLOSURE (:INTERNAL SWANK::REPL-EVAL) #x2100C1686F>)
6: (SWANK::CALL-WITH-RETRY-RESTART "Retry SLIME REPL evaluation request." #<CCL:COMPILED-LEXICAL-CLOSURE (:INTERNAL SWANK::REPL-EVAL) #x2100C168EF>)
7: (SWANK::CALL-WITH-BUFFER-SYNTAX NIL #<CCL:COMPILED-LEXICAL-CLOSURE (:INTERNAL SWANK::REPL-EVAL) #x2100C1692F>)
8: (SWANK::REPL-EVAL "(find 2 3 '((2 3) (1) (1)))\n")
9: (CCL::CALL-CHECK-REGS SWANK:LISTENER-EVAL "(find 2 3 '((2 3) (1) (1)))\n")
10: (CCL::CHEAP-EVAL (SWANK:LISTENER-EVAL "(find 2 3 '((2 3) (1) (1)))\n"))
11: (SWANK:EVAL-FOR-EMACS (SWANK:LISTENER-EVAL "(find 2 3 '((2 3) (1) (1)))\n") "COMMON-LISP-USER" 388)
12: (SWANK::PROCESS-REQUESTS NIL)
13: ((:INTERNAL SWANK::HANDLE-REQUESTS))
14: ((:INTERNAL SWANK::HANDLE-REQUESTS))
15: (SWANK-BACKEND:CALL-WITH-DEBUGGER-HOOK #<Compiled-function SWANK:SWANK-DEBUGGER-HOOK #x210073F1EF> #<CCL:COMPILED-LEXICAL-CLOSURE (:INTERNAL SWANK::HANDLE-REQUESTS) #x2100ADC64F>)
16: (SWANK::CALL-WITH-BINDINGS ((*STANDARD-OUTPUT* . #<SWANK-BACKEND::SLIME-OUTPUT-STREAM #x2100ADB44D>) (*STANDARD-INPUT* . #<SWANK-BACKEND::SLIME-INPUT-STREAM #x2100ADB80D>) ..))) #<CCL:COMPILED-LEXICAL..
17: (SWANK::HANDLE-REQUESTS #<CONNECTION #x210098BEDD> NIL)
18: (CCL::RUN-PROCESS-INITIAL-FORM #<PROCESS repl-thread(10) [Active] #x2100ACA69D> (#<CCL:COMPILED-LEXICAL-CLOSURE (:INTERNAL CCL::%PROCESS-RUN-FUNCTION) #x2100ACA43F>))
19: ((:INTERNAL (CCL::%PROCESS-PRESET-INTERNAL (CCL:PROCESS))) #<PROCESS repl-thread(10) [Active] #x2100ACA69D> (#<CCL:COMPILED-LEXICAL-CLOSURE (:INTERNAL CCL::%PROCESS-RUN-FUNCTION) #x2100ACA43F>))
20: ((:INTERNAL CCL::THREAD-MAKE-STARTUP-FUNCTION))

Если поменять местами аргументы в коде и при вызове функции, поставив список вперёд ("L A B" - у меня было так изначально), то также вызывает ошибку третий аргумент.

Подскажите, что не так и как это исправить, пожалуйста.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.05.2017, 22:52
Ответы с готовыми решениями:

Существует ли путь между двумя вершинами графа
Текст задачи: &quot;Граф задан с помощью цепных списков. Определить, существует ли путь между двумя заданными вершинами.&quot; Так как...

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

Существует ли прямой путь между вершинами
Всем привет, есть вот такий вот код, в котором я заполняю свой граф. Console.WriteLine(&quot;Enter amount of vertex:&quot;); ...

2
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
18.05.2017, 23:12
Существует встроенная функция find, её нельзя переопределять.

Непонятно, что значат аргументы у F.

Цитата Сообщение от Wizard13 Посмотреть сообщение
в каждом элементе списка перечисляю числа вершин, с которыми соединена вершина с порядковым номером данного элемента в списке.
Имхо не очень удачное представление. Странно кодировать номерами в списке. Удалить вершину нельзя, добавить сложно. Я бы сделал ((1 2 3) (2 1) (3 1)): в голове подсписка стоит вершина, потом — достижимые из неё вершины. Либо вообще ((1 2 3) ((1 2) (1 3))), памятуя о том, что граф — это пара из множества вершин и множества рёбер. Ещё бы функций настрогал типа vertices, edges, которые возвращали бы списки вершин и рёбер и т. п. В лиспе нет средств для работы с графами, надо создавать свои.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38171 / 21106 / 4307
Регистрация: 12.02.2012
Сообщений: 34,702
Записей в блоге: 14
19.05.2017, 10:49
Поправил:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
(defun search (v graph chk)  ;; найти первую вершину, связанную с v и непосещенную
  (dolist (i graph nil)
    (when (and (eq v (car i)) (not (member (cadr i) chk))) (return (cadr i)))
    (when (and (eq v (cadr i)) (not (member (car i) chk))) (return (car i)))))
 
    
(defun dfs (graph chk stack)
  (let ((w (if (null stack) nil (search (car stack) graph chk))))
       (cond ((and (null w) (null stack)) nil)
             ((null w) (dfs graph chk (cdr stack)))
             (t (cons (list (car stack) w) (dfs graph (cons w chk) (cons w stack)))))))
 
(defun path-exists (graph v1 v2)
   (let ((pth (dfs graph (list v1) (list v1))))
      (member v2 (apply 'append pth))))
 
;; Проба:
 
(path-exists '((a b) (a c) (b c) (d b) (d c) (b e) (d e)) 'c 'e)
 
==> T
 
(path-exists '((a b) (a c) (b c) (d b) (d c) (f e) (g e)) 'c 'e)
 
==> NIL
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.05.2017, 10:49
Помогаю со студенческими работами здесь

Определение наименьшего пути между двумя заданными вершинами графа
Помогите пожалуйста. Нужна самая простая программа. Разработать алгоритм определения наименьшего пути между двумя заданными вершинами графа

Граф - существует ли связь между двумя вершинами в обоих направлениях
В файле задан ориентированный граф. В первой строчке записано число N, которое обозначает кол-во вершин в графе. Во второй строчке записано...

Граф - существует ли связь между двумя вершинами в обоих направлениях
В файле задан ориентированный граф. В первой строчке записано число N, которое обозначает кол-во вершин в графе. Во второй строчке записано...

Граф - существует ли связь между двумя вершинами в обоих направлениях
В файле задан ориентированный граф. В первой строчке записано число N, которое обозначает кол-во вершин в графе. Во второй строчке записано...

Поиск кратчайших путей между двумя вершинами графа методом Шимбела.
Доброго всем время суток!! В универе задали на РГР написать программу в С++, которая находит кратчайший путь между двумя вершинами графа,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru