1

Тема: Статья Нахождение K-го кратчайшего пути

Привет, Максим

Я тут пробовал решить задачу с помощью http://e-maxx.ru/algo/kth_shortest_path

Идея хорошая, но полностью нерабочая smile
Не правильно оценена асимптотика - для крайних случаев не O(N^2 * K) а O(N! * K)

на полном графе с 30 вершинам считать будет годами.

2

Re: Статья Нахождение K-го кратчайшего пути

Прочитайте статью внимательнее. Там хорошо объяснено почему именно такая асимптотика.
Вы говорите про факториал, т.е. это количество всех возможных путей. Но в этом алгоритме мы не пройдем путей больше чем K. Этот нюанс специально контролируется тем, что мы не идем в те вершины, для которых предпросчитанное Дейкстрой расстояние больше чем надо.

Вы же говорите про вариант, когда К у нас близок к факториалу, т.е. надо найти один из самых длинных путей, в этом случае алгоритм действительно будет работать долго.
Но и здесь асимптотика описана верно, поскольку K становится примерно равным N!

3

Re: Статья Нахождение K-го кратчайшего пути

Это не так.

Для K = 200, N = 30, W = 1000 легко подобрать случай  когда решаться будет в O(30!)

"Этот нюанс специально контролируется тем, что мы не идем в те вершины, для которых предпросчитанное Дейкстрой расстояние больше чем надо. " Тоже не верно там чтоит <= то есть мы можем долго и упорно беребирать все возожные пути


Для наглядности - пусть у нас полный граф для 30 вершинами и еще одна 31 вершина которая идет в 1.

Пусть мы теперь запускаем kth_path_exists (100, 100, 1)   и t = 31

Первый же вызов сделает used[1] = true   т.е получится что в 31ю нам никак больше не добраться и алгоритм начнет перебирать все 30! путей пока не убедится что единственный путь это 1-31.

4

Re: Статья Нахождение K-го кратчайшего пути

Хмм, а ведь и правда фигня какая-то получается smile Всё дело в том, что условие "curlen + len + dist[to] <= maxlen" не гарантирует нам, что мы действительно найдём хотя бы один подходящий путь, если пойдём в to. Потому что вершины в пути не могут повторяться, а заранее выполненная Дейкстра ничего об этом не знала. Пример Olegа это демонстрирует.

Понятно, как исправить это с ухудшением асимптотики: на каждом уровне рекурсии после строки "used[v] = true;" выполнять Дейкстру из t во все вершины, но при этом все поюзанные вершины запретить; соответственно, в цикле по to ниже использовать эти только что вычисленные расстояния. Тем самым мы сможем гарантировать, что после захода в вершину to хотя бы один путь в t найдётся, и тогда алгоритм будет работать полиномиально. Но при этом, понятно, вся асимптотика умножится на время выполнения Дейкстры, что не очень хорошо.

В любом случае, в статье и правда серьёзная идейная ошибка, спасибо Olegу. Можно ещё попробовать подумать, как решить эту задачу без такого ухудшения асимптотики, а потом тогда я исправлю и статью.

P.S. Интересно, как тогда у меня этот код прошёл по задаче (где n<=100) в одном из problemsetов... smile

5

Re: Статья Нахождение K-го кратчайшего пути

Но ведь в статье описан чей то известный алгоритм ?
Разве тот дядька который этот алгоритм придумал не написал доказательство для этой штуки ...?
или это e-maxx твой алгоритм ?:P

6

Re: Статья Нахождение K-го кратчайшего пути

Максим, именно так я и пытался испрвать - на каждом шаге запускал простой dfs что б проверить найдем ли мы t или нет. Но получилось ужасно медленно sad.
Пришлось реализовывать Йена который уложился в лимит.

Да и curpath совсем не обязательно строил лексиграфически K-тый маршрут...


Егор,  там в начале сказано что самый известный - это Йена. Но это не он.