Время выполнения вашего алгоритма экспоненциально.Вы можете избежать этого, не вставляя вершину в кучу несколько раз, а связывая счетчик с каждой вершиной и увеличивая его с каждым новым путем к этой вершине.
Попробуйте что-то вроде этого:
initialize all counts of nodes to 0 // added
counts(v) = 1 // added
...
while Q is not empty
curr = pop(Q)
if( curr == end)
return counts(curr)
for all neighbors (nxt) of node curr do
if( level(nxt) == -1 )
level(nxt) = level(curr) + 1
counts(nxt) = counts(curr) // added
Push(Q, nxt)
else if( level(nxt) == level(curr) + 1 )
counts(nxt) += counts(curr) // added & removed
return 0
И это имеет ту же сложность, что и BFS - O(|E|+|V|)
.