Здравствуйте!
При решении задачи наткнулся на следующую подзадачу: у нас есть n элементов и для каждой пары известен штраф за то, что они стоят рядом в перестановке. Необходимо сгенерировать перестановку с минимальным суммарным штрафом. Можно ли это решать быстрее, чем за O(N!) с отсечениями?
Спасибо!
У вас есть N городов и для каждой пары дорога известной длинны. Вы пытаетесь найти маршрут посещающий все города по одному разу с минимальной длинной.
Кажется что-то напоминает, если я конечно не туплю... ;-)
Спасибо!
Только вот в отличии от коммивояжера, нам не надо возвращаться домой.
А много разницы-то?
Вашу задачу можно привести к коммивояжёрской если добавить ещё один город расстояния из которого до всех остальных будут 0. Решаете TSP и удаляете этот город получая незамкнутый маршрут на множестве исходных городов. %)
Действительно, спасибо большое!
Не уверен что заслужил "спасибо" :)
Во-первых вроде TSP точного решения намного быстрее предложенной вами ассимптотики не имеет, во-вторых то что незамкнутую задачу можно свести к замкнутой не означает обратного... :-o
Но надеюсь более умудрённые коллеги либо подскажут, либо опровергнут меня!
Сведение и правда не в ту сторону, однако концепция верная. В нужную сторону можно свести например так: заметим, что оптимальный цикл это ребро + некоторый кратчайший путь между двумя вершинами. Ребро будем перебирать, а кратчайший путь между его концами сводить к задаче выше: если мы хотим путь от a к b, то добавим вершины v1 и v2 и ребра a -> v1, b -> v2 и попросим кратчайший путь через все вершины в этом графе.
О, здорово — теперь даже жалко что не догадался сам :)
Спасибо!
Первое, что приходит в голову — можно за 2n * n2. Динамика вида DP[n][mask][last], mask — маска использованных элементов, last — последний использованный элемент.
Параметр N не нужен — хватает маски.
А еще кажется n на переход.
В смысле?
Спасибо, теперь всё понятно.
Не тупи больше)
Ну в этой динамике 2n·n2 состояний. И переход я умею делать только за n. Итого асимптотика 2n·n3
Блин... А как за 2n * n2 делать? Оо
UPD: А, блин, last не нужон, да? То есть можно просто перебрать элементы в маске и прибавить по меньшему ребру.
только никому
UPD неверно, на графе, где есть бесплатная звездочка, и дорогое все остальное, то ты найдешь ответ 0.
за O(2^N*N^2) можно. поменяйте название поста, чтобы лучше отражало суть