假设您需要从src到dest。
对于每个顶点x,关联两个值count和val,其中count是从src到x的最短路径数,val是从src到x的最短距离。还要维护一个visited变量,告诉我们这是第一次访问节点还是不是。
应用常规BFS算法,
Initialize u = src
visited[u] = 1,
val[u] = 0
count[u] = 1
For each child v of u,
if v is not visited
第一次访问节点时,它只有一条从src到now通过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
If v已经被访问过,意味着存在通过其他顶点到达v的一些其他路径,则会出现三种情况:
1. case val[v] == val[u]+1
如果当前的val[v](即通过u和到v的其他路径达到v的距离)等于val[u]+1,这意味着我们使用当前路径通过u到达v和到v的另一条路径具有相同的最短距离,则到v的最短距离保持不变,但是到达u的路径数量增加。
count[v] = count[v]+count[u]
2. 当我们使用 BFS 逐层遍历节点时,这种情况不会发生:图是无权的,因此第一次设置 val[v] 时,保证 val[v] 已经包含了从 src 到 v 的最短路径长度。
3. 在这种情况下,无需更改 val[v] 和 count[v] 的值,因为该路径不被视为最短路径。
执行此算法直至 BFS 完成。最终,val[dest] 包含源和 dest 之间的最短距离,count[dest] 包含从 src 到 dest 的路径数量。