查找有向未加权图中两个节点之间所有最短路径的数量

时间:2016-01-14 18:37:34

标签: algorithm graph shortest-path breadth-first-search

我需要帮助找到定向未加权图中两个节点之间所有最短路径的数量。

我能够找到使用BFS算法的最短路径之一,但我不知道如何找到所有最短路径。

我可以使用算法/伪代码的任何想法吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

您可以通过记住通往每个节点的路径数量,以及在发现新节点时总结该数字来实现。

为简单起见,我们假设您使用常规BFS算法,无论何时使用边(u,v),都会调用visit(u,v,k),其中:

u - the source node of the edge
v - the target node of the edge
k - the distance from the original source to u

除此之外,假设您有一个映射d:(vertex,distance)->#paths
这基本上是一个地图(或2D矩阵),它的关键是一对顶点和一个整数 - 距离,它的值是从源到该顶点的最短路径的数量,距离为k

很容易看出每个顶点v:

d[v,k] = sum { d[u,k-1] | for all edges (u,v) } 
d[source,0] = 0

现在,您可以轻松找到通向每个节点的最短路径k的数量。

<强>优化

你可以看到&#34;长度为k&#34;的最短路径的数量。是多余的,实际上每个顶点只需要k的一个值。这需要一些簿记,但节省了一些空间。

祝你好运!

答案 1 :(得分:1)

我想到的第一个想法是下一个:

让我们将起始点命名为s,将顶点命名为e

我们可以存储两个数组:DQD[i]是从si的最短路径的长度,Q[i]si之间的一些最短路径。< / p>

我们如何重新计算这些数组?

首先,设置D[s] = 0Q[s] = 1。然后我们可以使用众所周知的bfs

    while queue with vertexes is not empty

    get v from queue

    set v as visited

    for all u, there's an edge from v to u
        if u is not visited yet
            D[u] = D[v] + 1
            Q[u] = Q[v]
            push u into the queue
        else if D[v] + 1 == D[u]
            Q[u] += Q[v]

答案是Q[e]

答案 2 :(得分:0)

修改广度优先搜索,直到它开始寻找更长的路径,而不是停止并返回第一个路径。