Я не вижу, как вы можете использовать BFS или DFS здесь. Поскольку вам нужно перечислить все возможные пути от s
до t
, тогда вы не сможете решить проблему без какого-либо рекурсивного поиска. Более того, обычно количество путей будет экспоненциальным в k
, поэтому не надейтесь на какие-либо значительные улучшения асимптотической сложности.
На мой взгляд, только обрезка может немного помочь вам. Вот два способа подрезки стоит упомянуть:
Первый является встречаются в-середине подход.
Вместо того, чтобы искать для всех вершин, находящихся на расстоянии <= k
от вершины s
, найти две группы вершин: на расстоянии <= k/2
от s
и на расстоянии <= k/2
от t
. Просто запустите два запроса (BFS или рекурсивный), чтобы получить их. Наконец, объедините результаты: для каждой общей вершины v
в этих двух наборах возьмите все пары путей от s
до v
и пути от t
до v
(с обратной связью) и выведите объединенный путь.
Точный подход, описанный выше, будет перечислять несколько путей несколько раз. Чтобы исправить это, сохраните пути каждой конкретной длины в отдельном списке. Затем объедините пути каждой длины отдельно. Обратите внимание, что если вы хотите получить только простые пути (т. Е. Повторяющиеся вершины), то подход MitM равен , а не.
Второй способ заключается в использовании оценки расстояния, подобно тому, как это делает A* search algorithm. Предположим, что вы гарантировали нижние границы на расстоянии от любой вершины v
до конечной вершины t
. Затем вы можете удалить любой частичный путь от s
до v
, если он, безусловно, не может быть продолжен до достаточно короткого полного пути от s
до t
.
Разрешены ли циклы? Можете ли вы путешествовать в одну и ту же вершину дважды? –
@MukulGupta Да и да. – User1291