Поскольку ваша задача включает в себя TSP для k = n в качестве особого случая, в общем случае она будет NP-полной. Для малых k вы можете адаптировать решение по динамическому программированию Bellmann (1962), чтобы решить его за время O (2 ^ k n ^ 3).
Пусть T (u, S) - длина кратчайшего маршрута, начиная с вершины u, в которой вершины из S уже посещены. Тогда вы хотите наименьшее из T (u0, {u0}) по всем начальным вершинам u0. Т удовлетворяет рецидиву
T(u,S) = min { d(u,v)+T(v,S+{v}) | v in V\S } if |S|<k
T(u,S) = d(u,u0) if |S|=k
для расстояний d (u, v). В таблице DP есть 2 ^ kn записей, каждая запись занимает O (n) времени для вычисления, и вы должны вычислить его n раз для каждой начальной вершины.