Algorithm Floyd Warshall:所有最短路径
我已经实现了Floyd Warshall来返回每对节点/顶点之间的最短路径距离和每对节点/顶点之间的单个最短路径距离Algorithm Floyd Warshall:所有最短路径,algorithm,shortest-path,floyd-warshall,Algorithm,Shortest Path,Floyd Warshall,我已经实现了Floyd Warshall来返回每对节点/顶点之间的最短路径距离和每对节点/顶点之间的单个最短路径距离 有没有办法让它为每一对节点返回每一条最短路径,即使有多条路径被绑定为最短路径?(我只是想知道我是不是在浪费时间)如果你只需要计算存在多少条不同的最短路径,你可以在最短路径数组之外保留一个计数数组。下面是对中的伪代码的快速修改 如果需要找到所有路径的方法,可以为每对路径存储一个类似于vector/arraylist的结构,以便展开和折叠。下面是对同一版本的伪代码的修改 注意:路径[
有没有办法让它为每一对节点返回每一条最短路径,即使有多条路径被绑定为最短路径?(我只是想知道我是不是在浪费时间)如果你只需要计算存在多少条不同的最短路径,你可以在
最短路径
数组之外保留一个计数
数组。下面是对中的伪代码的快速修改
如果需要找到所有路径的方法,可以为每对路径存储一个类似于vector/arraylist的结构,以便展开和折叠。下面是对同一版本的伪代码的修改
注意:路径[i][j]
是一个邻接列表。初始化路径[i][j]
时,还可以通过向数组中添加-1
来初始化下一个[i][j]
。例如,next[i][j]
的初始化将是
for every edge (i,j) in graph:
next[i][j].push_back(-1)
这会考虑到边本身是最短路径。您必须在路径重建中处理这种特殊情况,这就是我在GetPath
中所做的
编辑:“最大值”是距离数组中的初始化值。在某些情况下,当前批准的应答中的“计数”功能会闪烁。更完整的解决方案是:
procedure FloydWarshallWithCount ()
for k := 1 to n
for i := 1 to n
for j := 1 to n
if path[i][j] == path[i][k]+path[k][j]
count[i][j] += count[i][k] * count[k][j]
else if path[i][j] > path[i][k] + path[k][j]
path[i][j] = path[i][k] + path[k][j]
count[i][j] = count[i][k] * count[k][j]
原因是,对于任意三个顶点i、j和k,可能有多条从i到k到j的最短路径。例如,在图表中:
3 1
(i) -------> (k) ---------> (j)
| ^
| |
| 1 | 1
| 1 |
(a) -------> (b)
这里有两条从i到j到k的路径
count[i][k]*count[k][j]
查找从i到k的路径数和从k到j的路径数,并将它们相乘以查找路径数i->k->j。使用键=路径长度和值={此长度的最短路径集}
将所有“最短路径”保存在HashMap
中。将最短路径长度保存在一个单独的变量中,算法完成后,只需从HashMap
中提取最小值。我通过添加和k!=j
至的else if
语句。然后我编写了一个递归函数来逐步执行next
。它将next
中等于当前节点的值解释为可以直接访问下一个节点。这是解释/分解下一个矩阵的合理方式吗?或者有更干净/更清晰的方法吗?@user1507844忽略了k!=j
零件。编辑我的答案以反映它。@user1507844我添加了路径重建代码。如果存在直接边,我使用-1
作为索引;但是您存储其中一个节点的技术也很好。我注意到您还添加了k!=我
,那是干什么用的?不确定我是否理解-1
部分。下一个中的条目在哪里设置为-1
?这就是它初始化的目的吗?再次感谢你的邀请help@user1507844添加了更多说明。
for every edge (i,j) in graph:
next[i][j].push_back(-1)
procedure FloydWarshallWithCount ()
for k := 1 to n
for i := 1 to n
for j := 1 to n
if path[i][j] == path[i][k]+path[k][j]
count[i][j] += count[i][k] * count[k][j]
else if path[i][j] > path[i][k] + path[k][j]
path[i][j] = path[i][k] + path[k][j]
count[i][j] = count[i][k] * count[k][j]
3 1
(i) -------> (k) ---------> (j)
| ^
| |
| 1 | 1
| 1 |
(a) -------> (b)