【问题标题】:Number of shortest paths in a graph图中最短路径的数量
【发布时间】:2013-03-04 21:38:00
【问题描述】:

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

How to find the number of different shortest paths between two vertices, in directed graph and with linear-time?

但我不太明白。有人可以把算法写下来,以便我更好地理解它吗?

【问题讨论】:

    标签: graph


    【解决方案1】:

    假设您需要从 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到现在通过u只有一条路径,所以到v的最短路径是(1+到u的最短路径),通过shortest到达v的路径数path 与 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. 案例val[v] == val[u]+1

    如果当前 val[v](通过其他路径到达 v)等于 val[u]+1,即我们使用通过 u 的当前路径和另一条向上的路径到达 v 的最短距离相等到v,那么到v的最短距离保持不变,但是路径的数量会随着到达u的路径数量的增加而增加。

    count[v] = count[v]+count[u]
            
    
    1. 案例val[v] > val[u]+1

    由于我们使用 BFS 逐级遍历节点,这种情况不可能发生:图是未加权的,所以我们第一次设置 val[v] 时,保证 val[v] 已经包含从 src 到 v 的最短路径。

    1. 案例val[v] < val[u]+1

    在这种情况下,不需要更改 val[v] 和 count[v] 的值,因为这条路径不算最短路径

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

    【讨论】:

    • 那么,当您调用顶点“已访问”时,这意味着它当前在 BFS 队列中吗?所以当它不再在队列中时,我应该在遇到它时跳过它?
    • 另外,我在哪里添加计数值?当我从 src 顶点中的零计数开始时,将一直为零。
    • 未访问表示访问过一次。它不需要在那个时候排队。为了计数,这是我的错误。将 count[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) 不会发生。我想我当时也没有注意到这一点。感谢您指出错误。
    猜你喜欢
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    相关资源
    最近更新 更多