Этот следующий код от https://www.geeksforgeeks.org/shortest-path-exactly-k-edges-directed-weighted-graph/. Все кредиты идут в PranchalK.
Я имею дело с проблемой генерации кратчайшего пути по k-краю.Приведенный ниже код дает кратчайшее «расстояние» с предопределенным значением k.
Однако мне понадобится «путь». Для кода ниже путь выглядит следующим образом:
0 -> 2 -> 3.
Edit: код Ajay решает эту проблему.Однако каждый узел необходимо посетить только один раз.Я не упоминал об этом в первоначальном вопросе.Я включил дополнительный набор данных, чтобы проверить это.
# Python3 program to find shortest path
# with exactly k edges
# Define number of vertices in the graph
# and inifinite value
# A naive recursive function to count
# walks from u to v with k edges
def shortestPath(graph, u, v, k):
V = 4
INF = 999999999999
# Base cases
if k == 0 and u == v:
return 0
if k == 1 and graph[u][v] != INF:
return graph[u][v]
if k <= 0:
return INF
# Initialize result
res = INF
# Go to all adjacents of u and recur
for i in range(V):
if graph[u][i] != INF and u != i and v != i:
rec_res = shortestPath(graph, i, v, k - 1)
if rec_res != INF:
res = min(res, graph[u][i] + rec_res)
return res
# Driver Code
if __name__ == '__main__':
INF = 999999999999
# Let us create the graph shown
# in above diagram
graph = [[0, 10, 3, 2],
[INF, 0, INF, 7],
[INF, INF, 0, 6],
[INF, INF, INF, 0]]
u = 0
v = 3
k = 2
print("Weight of the shortest path is",
shortestPath(graph, u, v, k))
# This code is contributed by PranchalK
Ожидаемый результат:
[0,2,3]
0 - начальный узел, 3 - конечный узел.Число ребер равно 2. Путь 0 -> 2 -> 3
Правка: ответ Аджая очень и очень близок.Однако каждый узел необходимо посетить только один раз.Мне жаль, что я не упомянул об этом изначально.Вот большие данные для тестирования.
graph = [[0, 10, 3, 2,4,1],
[1, 0, 3, 7,4,1],
[2, 8, 0, 6,0,1],
[4, 1, 3, 0,1,2],
[3, 1, 2, 2,4,1],
[7, 1, 3, 0,3,3]]
Weight of the shortest path is 14
Shortest path is [0, 2, 0, 2, 3]