Подтвердить что ты не робот

Число кратчайших путей в графе

Мне нужно найти число всех путей между двумя узлами графа, используя BFS. Я думаю, что ответ на мой вопрос можно найти здесь:

Как найти количество различных кратчайших путей между двумя вершинами, в ориентированном графе и с линейным временем?

Но я не совсем понимаю. Может кто-нибудь, пожалуйста, напишите алгоритм другими словами, чтобы лучше понять его?

4b9b3361

Ответ 1

Скажем, вам нужно перейти от src к dest.

С каждой вершиной x свяжите два значения count и val, count - это число кратчайшего пути от src до x, а val - кратчайшее расстояние от src до x. Также поддерживайте посещенную переменную, указав, прибывает ли node в первый раз.

Применить обычный алгоритм BFS,

Initialize u = src
visited[u] = 1,val[u] = count[u] = 1
For each child v of u,
    if v is not visited 

A node посещается в первый раз, поэтому он имеет только один путь от источника до настоящего времени через u, поэтому самый короткий путь до v - это 1 + самый короткий путь до u, а количество способов достижения v по кратчайшему пути такое же, как и count [u], поскольку говорят, что u имеет 5 способов достичь от источника, тогда только эти 5 способов могут быть расширены до v, поскольку v встречается впервые через u, поэтому

val[v] = val[u]+1,    
count[v] = count[u], 
visited[v] = 1

if v is visited

Если v уже посещен, что означает, что путь другой путь до v через некоторые другие вершины, то возникают три случая:

1 :if val[v] == val[u]+1  

если текущий val [v], который является dist до v через какой-либо другой путь, равен val [u] +1, т.е. мы имеем равные кратчайшие расстояния для достижения v, используя текущий путь через u, а другой путь до v, тогда кратчайшее расстояние до v остается таким же, но число пути увеличивается по числу путей достижения u.

count[v] = count[v]+count[u]

2: val[v] > val[u]+1

Если текущий путь достижения v меньше предыдущего значения val [v], тогда val [v] хранит текущий путь, а счетчик [v] также обновляется

val[v] = val[u]+1
count[v] = count[u]

Третий случай: если текущий путь имеет расстояние больше предыдущего пути, в этом случае нет необходимости изменять значения val [v] и count [v]

Сделайте этот алгоритм до завершения BFS. В конце val [dest] содержит кратчайшее расстояние от источника, а count [dest] содержит количество путей от src до dest.