![]() |
|
![]() ![]() ![]() |
|
alex35 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 2.9.2006 Репутация: нет Всего: нет |
Дан связанный взвешенный граф G с заданной бинарной весовой функцией (т.е. каждое ребро может иметь вес 1 или 0).
Даны две вершины a и b и число n. Требуется найти путь (вершины в котором, по определению, не повторяются) из вершины a в вершину b с заданным количеством ребер n и минимальным весом (т.е. минимальным числом ребер в пути с весом 1). Условие по количеству ребер жесткое, должно равняться точно n. Буду очень благодарен за любой предложенный эффективный алгоритм желательно с оценкой сложности О. Псевдо-код, Паскаль, что угодно (кроме может быть, Ассемблера ![]() Заранее спасибо, С уважением, А. |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
суть такая:
определить множество вершин, в которые можно добраться из точки a с нулевой стоимостью определить, куда можно добраться со стоимостью 1 со стоимостью 2 и т.д. на каждом шаге проверять, не попала ли точка b в определяемое множество, как только попала, заканчиваем более подробно: множество A0={a} множество Bn={все вершины, кудаможно добраться из элементов множества An по нулевым рёбрам} потом выбираем все рёбра от элементов Bn, которые имеют вес 1 и заканчиваются в необработанных вершинах (т.е. не в B0,B1,...Bn), их (рёбер) концы составляют следующее множество An+1, а из него опять делаем Bn+1, потом An+2 и т.д. ... Добавлено @ 20:15 упс... не заметил ограничения на количество рёбер в пути... Добавлено @ 20:27 фиксируем a 1. решаем задачу для всех точек и n=1 (в некоторых случаях решения не будет) 2. для n=2 ... (до нужной длины) для того, чтобы из решения для n получить ршение для n+1: для исследуемой точки (к которой пытаемся построить путь длиной n+1) смотрим всех соседей, для которых существует путь с длиной n, из них выбираем путь с минимальным весом Добавлено @ 20:28 ... опять упс ![]() при таком подходе вершины в путях могут повторяться... так что надо как-то алгоритм модифицировать... -------------------- qqq |
|||
|
||||
comtat |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1310 Регистрация: 2.5.2006 Где: Россия, Казань Репутация: 1 Всего: 71 |
Если метод Флойда под это прокатит могу преслать исходник
![]() -------------------- Рожденный в СССР !!! ExtJS - мой фреймворк |
|||
|
||||
comtat |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1310 Регистрация: 2.5.2006 Где: Россия, Казань Репутация: 1 Всего: 71 |
давай мыло плишлю исходник
-------------------- Рожденный в СССР !!! ExtJS - мой фреймворк |
|||
|
||||
alex35 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 2.9.2006 Репутация: нет Всего: нет |
comtat, к сожалению, алгоритм Флойда предназначен для нахождения кратчайших путей во взвешенном графе без учета количества ребер в пути. А в моей задачи стоит жесткое условие - заданное количество ребер.
Или можно как то адаптировать алгоритм Флойда к определенному числу ребер? ![]() |
|||
|
||||
comtat |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1310 Регистрация: 2.5.2006 Где: Россия, Казань Репутация: 1 Всего: 71 |
Дык, я незнаю, но поэтой теме что нельзя 100 % не дам -------------------- Рожденный в СССР !!! ExtJS - мой фреймворк |
|||
|
||||
alex35 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 2.9.2006 Репутация: нет Всего: нет |
Я вот смотрю на алгоритм Йена (Yen) поиска К кратчайших путей во взвешенном графе и думаю, как его (Йена) адаптировать под мою задачу. Может, у кого нибудь есть мысли на этот счет?
|
|||
|
||||
pablo |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 320 Регистрация: 12.2.2005 Где: Вильнюс, Литва Репутация: нет Всего: 6 |
Мне известны 2 алгоритма:
1) Дейкстры 2) Беллмана - Форда (Если в графе есть отрицательные веса) Реализация обоих есть в boost -------------------- Первый блин всегда похож на сферу, иногда бывает и куб. |
|||
|
||||
comtat |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1310 Регистрация: 2.5.2006 Где: Россия, Казань Репутация: 1 Всего: 71 |
Могу сказать, что когда Флойд ищет оптимальный путь, то из двух оптимальных путей он выберет тот, у которого ребер меньше. -------------------- Рожденный в СССР !!! ExtJS - мой фреймворк |
|||
|
||||
Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 1 Всего: 37 |
Вроде не так и сложно (по времени выполнения) генерировать все возможные пути из а длины n и затем, выбрать из них те, которые заканчиваются b. а затем из них - с наименьшим весом.
|
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
зависит от количества рёбер если граф полный, то перебор всех путей из n рёбер будет x^n (x - среднее количество рёбер из вершины) так что скорость роста экспоненциальная, что довольно немало если убрать требование неповторяемости, то мой вариант можно использовать но, чтобы убрать повторяемые узлы, придётся для каждой вершины хранить не только оптимальный путь вообще, а и оптимальный путь, в зависимости от множества используемых вершин, чтобы знать, какой путь через какие вершины проходит, когда выбирать на следующем шаге это приведёт к тому, что придётся для каждой вершины хранить кучу путей, количество которых с ходу и оценить не получается но это - всего лишь один вариант, который мне пришёл в голову, вполне может быть и другой хотя проблема здесь сходна с проблемой построения гамильтонова цикла, а там с вычислительной сложностью тоже проблемы... -------------------- qqq |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |