我需要帮助找到定向未加权图中两个节点之间所有最短路径的数量。
我能够找到使用BFS算法的最短路径之一,但我不知道如何找到所有最短路径。
我可以使用算法/伪代码的任何想法吗?
谢谢!
答案 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
。
我们可以存储两个数组:D
和Q
。 D[i]
是从s
到i
的最短路径的长度,Q[i]
是s
和i
之间的一些最短路径。< / p>
我们如何重新计算这些数组?
首先,设置D[s] = 0
和Q[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)
修改广度优先搜索,直到它开始寻找更长的路径,而不是停止并返回第一个路径。