我试图通过计算所有对之间的最短路径,使用Floyd-Warshall算法找到源和目标之间的最短路径。
我需要找到最短的路径而不仅仅是距离。这就是我想要做的:
我将第一个顶点存储在从i到j的最短路径上。每当从i到j的最短路径更新并且现在经过k时,我将第一个顶点设置在从i到j的最短路径上,再到从i到k的最短路径上的第一个顶点。
/*first[i][j] is the first vertex after i on the shortest path from i to j.
first[i][j] is initially j if there is an edge from i to j and the dist[i][j] is the weight of the edge. Otherwise f[i][j] is -1 and the cost is infinity.
*/
for(k = 0; k < N; ++k){
for(i = 0; i < N; ++i){
for(j = 0; j < N; ++j){
if(dist[i][j] >= dist[i][k]+dist[k][j]){
dist[i][j] = dist[i][k]+dist[k][j];
//When the distance is updated, update first[i][j]
first[i][j] = first[i][k];
}
}
}
}
该算法的问题在于,当我在下图中运行此算法时,此算法找到的路径是无限循环。
以下是算法计算的first
矩阵:
4 4 4 4 4 4
2 2 2 2 2 2
5 5 5 5 5 5
1 1 1 1 1 1
0 0 0 0 0 0
2 2 2 2 2 2
从0到任何其他顶点的最短路径上的第一个顶点,根据算法是4,但是从4到任何其他顶点的最短路径上的第一个顶点是0.
我已阅读Wikipedia文章以及有关SO的一些问题,但它们没有多大帮助。
答案 0 :(得分:1)
您的dist
矩阵似乎已经正确计算,但您的first
矩阵添加似乎存在零成本边缘问题。
请参阅此代码稍微修改过的python版本,该版本使用0.01
作为所有自我边缘和其他0成本边缘的成本。
该代码输出(希望)正确的dist
和first
矩阵
[0.01, inf, inf, 0.01, 0.01, inf]
[0.02, 0.01, 0.01, 0.01, 0.03, 0.02]
[0.01, inf, 0.01, 0.02, 0.02, 0.01]
[ inf, inf, inf, 0.01, inf, inf]
[0.01, inf, inf, 0.02, 0.01, inf]
[0.02, inf, 0.01, 0.01, 0.03, 0.01]
和
[ 0, None, None, 3, 4, None]
[ 2, 1, 2, 3, 2, 2]
[ 0, None, 2, 5, 0, 5]
[None, None, None, 3, None, None]
[ 0, None, None, 0, 4, None]
[ 2, None, 2, 3, 2, 5]