![](/img/trans.png)
[英]Finding all the shortest paths between two nodes in unweighted undirected graph
[英]Finding the number of all the shortest paths between two nodes in directed unweighted graph
我需要帮助来查找有向非加权图中两个节点之间所有最短路径的数量。
我能够使用BFS算法找到最短路径之一,但我不知道如何找到所有最短路径。
我可以使用算法/伪代码的任何想法吗?
谢谢!!
您可以通过记住通向每个节点的路径数以及发现一个新节点时的数量-汇总该数字来做到这一点。
为简单起见,我们假设您有常规的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
的最短路径k
。
很容易看到每个顶点v:
d[v,k] = sum { d[u,k-1] | for all edges (u,v) }
d[source,0] = 0
现在,您可以轻松找到通向每个节点的长度为k
的最短路径的数量。
优化:
您会看到“长度为k的最短路径数”是多余的,实际上每个顶点只需要一个k
值。 这需要进行簿记,但可以节省一些空间。
祝好运!
我想到的第一个想法是下一个:
让我们将顶点命名为s
并将结束顶点命名为e
。
我们可以存储两个数组: D
和Q
D[i]
是从s
到i
的最短路径的长度,而Q[i]
是s
和i
之间s
最短路径的数量。
我们如何重新计算这些数组?
首先,设置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]
。
修改广度优先搜索以继续进行,直到找到更长的路径为止,而不是停止并仅返回第一个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.