Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm Floyd Warshall:所有最短路径_Algorithm_Shortest Path_Floyd Warshall - Fatal编程技术网

Algorithm Floyd Warshall:所有最短路径

Algorithm Floyd Warshall:所有最短路径,algorithm,shortest-path,floyd-warshall,Algorithm,Shortest Path,Floyd Warshall,我已经实现了Floyd Warshall来返回每对节点/顶点之间的最短路径距离和每对节点/顶点之间的单个最短路径距离 有没有办法让它为每一对节点返回每一条最短路径,即使有多条路径被绑定为最短路径?(我只是想知道我是不是在浪费时间)如果你只需要计算存在多少条不同的最短路径,你可以在最短路径数组之外保留一个计数数组。下面是对中的伪代码的快速修改 如果需要找到所有路径的方法,可以为每对路径存储一个类似于vector/arraylist的结构,以便展开和折叠。下面是对同一版本的伪代码的修改 注意:路径[

我已经实现了Floyd Warshall来返回每对节点/顶点之间的最短路径距离和每对节点/顶点之间的单个最短路径距离


有没有办法让它为每一对节点返回每一条最短路径,即使有多条路径被绑定为最短路径?(我只是想知道我是不是在浪费时间)

如果你只需要计算存在多少条不同的最短路径,你可以在
最短路径
数组之外保留一个
计数
数组。下面是对中的伪代码的快速修改

如果需要找到所有路径的方法,可以为每对路径存储一个类似于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)