|
712 / 351 / 120
Регистрация: 09.12.2020
Сообщений: 918
|
|
Найти оптимальный путь по графу17.10.2021, 00:42. Показов 12216. Ответов 11
Здравствуйте! Всегда относился с неким страхом к рекурсивным функциям, мне они не очень понятны. Теперь нужно написать программу, которая ищет оптимальный путь по "графу" из точки a в точку b. Я так понимаю, это можно решить классическим перебором, более того - я даже смогу решить это обычным перебором, но требуется решить это именно рекурсией. Задача такова: задан граф(пример графа в прикрепленном изображении), дана начальная и конечная точки, даны цены перехода из одной точки в другую, т.е. '1 2 7' - перейти из точки 1 в точку 2 стоит 7. И тд. Решить требуется рекурсией. Я не прошу присылать готовый код, тем более что я не указал четких условий, прошу навести меня на мысль. Спасибо
0
|
|
| 17.10.2021, 00:42 | |
|
Ответы с готовыми решениями:
11
Оптимальный путь
|
|
1956 / 874 / 352
Регистрация: 05.09.2021
Сообщений: 1,387
|
|
| 17.10.2021, 01:33 | |
|
alilxxey, Вроде это называется алгоритм Дейкстры. Там есть что-то типа поиск в глубину и поиск в ширину.
3
|
|
|
Заблокирован
|
|
| 17.10.2021, 09:09 | |
|
граф не ориентированный, составить матрицу 6*6 и в ребрах допустим 5-6(4-5,5-4=9),
у кого ребер нет(5-2,5-1,5-5 и пр.=0)вот по этой матрице рекурсивно DFS
2
|
|
|
712 / 351 / 120
Регистрация: 09.12.2020
Сообщений: 918
|
||||||
| 17.10.2021, 15:22 [ТС] | ||||||
|
переписал алгоритм Дейкстры, слегка адаптировав его под свою задачу
* 1000000 - несуществующая грань
2
|
||||||
|
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
|
|
| 17.10.2021, 19:06 | |
|
anton78spb, Здравствуйте! Алгоритм Дейкстры предполагает использования динамического программирования с жадным перебором вершин.
alilxxey, Добрый вечер! Если вам чётка указали на то что нужно решить рекурсией то скорее всего не предполагается использовать какие либо алгоритмы на графах, а просто путём перебора выбрать оптимальный путь от точки A до точки B. Перебор осуществлять, как ответил Exp2dot7,, через DFS. ![]() Я даже скажу больше, я уверен что не надо использовать готовые алгоритмы на графах по типу Дейкстры и прочих. Потому как эти алгоритмы не являются рекурсивными Исходя из этого под описания рекурсивного поиска попадает только алгоритм DFS.Catstail, Здравствуйте! BFS тут вряд ли подойдёт, потому что рёбра имеют вес.
2
|
|
|
Супер-модератор
|
||||||
| 17.10.2021, 19:39 | ||||||
|
no swear, да, я неправ. Нужен DFS. Вот честный перебор всех каркасов с поиском кратчайшего пути. Этот алгоритм гораздо менее эффективен, чем чем алгоритм Дейскстры. Но он удовлетворяет условиям задачи:
2
|
||||||
|
712 / 351 / 120
Регистрация: 09.12.2020
Сообщений: 918
|
|
| 17.10.2021, 21:23 [ТС] | |
|
Catstail, хорошее решение. но граф
Кликните здесь для просмотра всего текста
1 2 1
2 3 2 3 4 3 из 2 в 4.
1
|
|
|
192 / 166 / 82
Регистрация: 01.07.2016
Сообщений: 943
|
|
| 17.10.2021, 23:30 | |
|
alilxxey, Надо сохранять все полученные пути(вершины) от старта до финиша и затем каждый раз когда будете доходит до финиша, нужно будет проверить полученный путь(вершины) со всеми предыдущими путями(вершинами).
Добавлено через 12 минут И ещё вместе с этим надо будет постоянно обновлять список использованных вершин при каждом заходе или выходе из рекурсии. К примеру, начали путь в вершине 1 и хотим попасть в вершину 5. Из 1ой вершины идём во вторую и помечаем 1ю как использованную used[1] = true, из второй в 3ю и помечаем 2ю как использованную used[2] = true, из 3й в 4ю и used[3] = true, из 4й в 5ю used[5] = true. Теперь на выходе из рекурсии на 5ой вершине used[5] = false, переходим в 4ю вершину, из 4й некуда идти потому что used[2] = true, переход в третью вершину и used[4] = false. Идём из 3й в 6ю и used[3] = true так и остаётся, из 6й в 5ю и used[6] = true. Выходим из 5й в 6ю, из 6й некуда идти потому что used[1] = true
0
|
|
|
Супер-модератор
|
||||||
| 18.10.2021, 10:41 | ||||||
Сообщение было отмечено alilxxey как решение
Решение
no swear, это не совсем так. Проблема не в поиске каркасов, а в построении пути. Чуть позже выложу исправленный вариант.
Добавлено через 1 час 25 минут Вот исправленный вариант. На самом деле, это вариант бэктрекинга (перебора с возвратом). Он генерирует все стягивающие деревья (каркасы) графа, начиная со стартовой вершины. Потом, перебирая каркасы, ищет путь до финишной вершины с кратчайшим весом.
alilxxey, поправил решение.
1
|
||||||
|
712 / 351 / 120
Регистрация: 09.12.2020
Сообщений: 918
|
|
| 18.10.2021, 11:06 [ТС] | |
|
Catstail, отличное решение, спасибо большое! Буду разбираться.
1
|
|
|
Супер-модератор
|
||||||
| 03.05.2022, 09:12 | ||||||
|
Если нужно задавать граф в диалоге. Как вариант:
0
|
||||||
| 03.05.2022, 09:12 | |
|
Помогаю со студенческими работами здесь
12
Оптимальный путь Оптимальный путь Оптимальный путь
Найти оптимальный путь в двумерном массиве Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|