Вы можете просто запустить DFS от источника до цели, чтобы проанализировать все пути. Если вам нужно найти количество путей, вы останавливаетесь, когда достигаете глубины K, возвращающей 0, и когда вы достигаете цели, возвращающей 1, и если вам нужно также описать пути, вы можете построить дерево во время исследования с помощью DFS. Сложность будет O (E), где E - число ребер
Здесь смесь питона и псевдокода:
def DFS(node, depth, target, visited, graph, max_depth):
visited.add(node)
if depth >= max_depth:
return Null
elif node == target:
return new_tree_node(node)
else:
sub_trees = list()
for connected_node in graph[node]:
if connected_node not in visited:
sub_tree = DFS(connected_node, depth+1, target, visited, graph, max_depth)
if sub_tree != Null:
sub_trees.append(sub_tree)
if length(sub_trees) > 0:
tree_node = new_tree_node(node)
for sub_tree in sub_trees:
tree_node.add_child(sub_tree)
return tree_node
else:
return Null
tree = DFS(source, 0, target, set(), graph, K)
PS: это решение можно легко адаптировать к взвешенному графу какхорошо