Когда вам нужно рассмотреть пути с фиксированным числом ребер, динамическое программирование часто приходит на помощь (в то время как другие подходы часто терпят неудачу).
Давайте обозначим dp[v][j]
максимальную стоимость пути извершина i
(фиксированная) к вершине v
, которая имеет ровно j
ребер.
Для начальных значений можно установить значения для j==1
: dp[v][1]
- это стоимость ребра от *От 1011 * до v
(или 0
, если такого ребра не существует).Или, если подумать, будет очевидно, что вы можете установить значения для j==0
, а не j==1
: dp[i][0]
равно 1, тогда как dp[v][0]
можно установить на ноль для v!=i
.
Теперь, если у вас есть значения для некоторых j
, легко вычислить значения для j+1
:
dp[v][j+1] = max( dp[v'][j] * cost((v', v)) )
Это очень похоже на алгоритм Форд-Беллмана , толькочто последний не должен отслеживать количество ребер и, следовательно, может использовать одномерный массив.
Это дает решение в O((E+V)*k)
.Не совсем то, что вы просили, но я сомневаюсь, что существует решение в O(E+V*k)
.
(В приведенном выше решении я предполагаю, что константа C
является положительной, и поэтому путь с нулевой стоимостью эквивалентенна пути, который абсолютно отсутствует. Если вам нужно, вы можете специально учесть случай C==0
.