Graph 图中最短路径的数目

Graph 图中最短路径的数目,graph,Graph,我需要使用BFS找到图中两个节点之间的所有路径数。我想我的问题的答案可以在这里找到: 但我不太明白。有人能用别的话把算法写下来让我更好地理解吗?假设你需要从src到dest 对于每个顶点x,关联两个值count和val,其中count是从src到x的最短路径数,val是从src到x的最短距离。还要维护一个VISTER变量,告知这是否是第一次访问节点 应用常用的BFS算法 Initialize u = src visited[u] = 1, val[u] = 0 count[u] = 1 Fo

我需要使用BFS找到图中两个节点之间的所有路径数。我想我的问题的答案可以在这里找到:


但我不太明白。有人能用别的话把算法写下来让我更好地理解吗?

假设你需要从src到dest

对于每个顶点x,关联两个值count和val,其中count是从src到x的最短路径数,val是从src到x的最短距离。还要维护一个VISTER变量,告知这是否是第一次访问节点

应用常用的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到现在通过u的路径,因此到v的最短路径是(1+到u的最短路径),通过最短路径到达v的路径数与计数[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的其他路径,则会出现三种情况:

  • 案例
    val[v]==val[u]+1
  • 如果当前val[v](通过其他路径到v的距离)等于val[u]+1,即使用当前路径通过u到达v的最短距离与其他路径到v的最短距离相等,则到v的最短距离保持不变,但路径数随着到达u的路径数的增加而增加

    count[v] = count[v]+count[u]
            
    
  • 案例
    val[v]>val[u]+1
  • 当我们使用BFS逐层遍历节点时,这种情况是不会发生的:图是未加权的,因此我们第一次设置val[v]时,可以保证val[v]已经包含从src到v的最短路径的长度

  • 案例
    val[v]
  • 在这种情况下,无需更改val[v]和count[v]的值,因为此路径不算作最短路径

    执行此算法直到BFS完成。
    最后,val[dest]包含到源的最短距离,count[dest]包含从src到dest的路径数。

    那么,当您调用顶点“已访问”时,这意味着它当前在BFS队列中?因此,当它不再在队列中时,我应该在遇到它时跳过它?另外,我在哪里添加计数值?当我从src顶点的零计数开始时,整个过程都是零。没有访问意味着它只访问一次。当时它不需要排队。伯爵,这是我的错误。初始化计数[src]为1,因为从src到src的方法数为1。在案例2中(val[v]>val[u]+1)。正如答案中所述,我们显然需要更新count[v]和val[v],也就是说,count[v]'和val[v]'。我们是否也应该将任何节点z(其val[z]已设置为val[v]+1)更新为val[v]'+1?此外,我认为我们不应该在到达目的地时就停下来。例如,考虑多个边在DEST结尾的情况,其中两个是最短路径的一部分。是的,你应该是正确的,终止不应该在找到目的地后立即。我不知道为什么我当时没想到。根据您的第一个问题,您又是对的,但由于它是BFS,所以这种情况(val[v]>val[u]+1)不会发生,因为您是逐级进行的。我想我当时也没有注意到这一点。谢谢你强调错误。