Вот псевдокод (то есть непроверенный Python) для этого.
path_count[s] = 1
length_to[s] = 0
todo = [s] # A queue
while len(todo):
v = todo.pop(0)
for w in edges(graph, v):
if w not in length_to:
length_to[w] = length_to[v] + 1
path_count[w] = 0
todo.append(w)
if length_to[w] == length_to[v] + 1:
path_count[w] += path_count[v]
После этого length_to[v]
задает длину кратчайшего пути для v
, а paths_to[v]
дает число кратчайших путей к v
. (Что вы и искали.)