Мотаясь по различным делам из одной точки в другую, заметил, что маршруты дел могут накрываться и что для некоторого списка дел можно придумать оптимальный маршрут по контрольным точкам так, чтобы выполнить все дела, затратив наименьшее количество усилий.
Теперь более официальное условие задачи: есть связный взвешенный неориентированный граф без петель и кратных ребер. Также есть список дел. Требуется из данной вершины S придти в F, при этом выполнив все дела из списка. Дело представляет из себя пару чисел si и fi — номера вершин в графе, для каждого дела нужно сначала посетить si, а затем посетить fi. Надо вывести длину минимального пути из S в F, который покрывает все дела, а также сам этот путь. Пусть будет N вершин, M ребер и K дел. Нужно найти самое оптимальное решение. UPD1: Дела необязательно делать последовательно, можно выполнять несколько дел одновременно в любом порядке, в этом и смысл задачи.
Прошу помочь в решении этой задачи, потому что стало интересно, а сам додуматься не смог. Также прошу прощения, если это где-то уже обсуждалось или же за формулировкой задачи скрыто что-то совсем простое, а я не заметил.
UPD2: в комментариях было сказано про метод отжига, статьи о нем можно почитать здесь. Я, если честно, не очень понял, если кто-то может подробно его описать на примере этой задачи, я буду очень благодарен.
Видимо алгоритм Дейкстры (
O((n*n+m)*k)
илиO(m*log(n)*k)
) или Флойда (O(n*n*n+k)
), в зависимости от того, что выгоднее.UPD1. Это будет точное полное решение. Наверное можно придумывать какие-то вероятностные решения, с некоторыми эвристиками и пр., но это не всегда будет 100% оптимально.
UPD2. Думаю, если задача будет отображена на жизнь и реальные карты местности (города), то граф будет разрежен и оптимальнее всего будет алгоритм Дейкстры, работающий за
O(m*log(n))
, то есть общая сложность алгоритма составитO(m*log(n)*k)
.А мне показалось, что дела делаются не последовательно, а можно, например, по пути из s1 в f1 пройти через s2 и f2. Если так, это NP, так как сложнее TSP.
А.. блин. Я почему-то подумал, что нельзя выполнять одновременно много дел. Тогда да, задача хана, я не знаю, как такие задачи решать.
Дополнил условие, чтобы точно было ясно, что требуется. Кратчайшие пути и я умею искать :)
Видимо в таких задачах метод отжига самое оптимальное.
Что такое метод отжига? Можешь рассказать, ну, или скинуть ссылки, где о нем почитать?
Тут можно почитать
http://codeforces.me/blog/entry/1666
http://codeforces.me/blog/entry/4287
Точно она решается динамикой по подмножествам, аналогичной TSP, за что-то типа k222k.