【发布时间】:2013-11-17 18:55:12
【问题描述】:
我阅读了Wikipedia 给出的方法,通过修改 Floyd Warshall 算法在图中以两个给定点打印短路路径。我对此进行了编码,但它并没有真正给出预期的输出:
将
minimumDistanceMatrix[i][j]中的所有元素初始化为图中各自的权重,将矩阵shortestPathCalculatorMatrix [i][j]中的所有元素初始化为-1。-
然后:
// Find shortest path using Floyd–Warshall algorithm for ( unsigned int k = 0 ; k < getTotalNumberOfCities() ; ++ k) for ( unsigned int i = 0 ; i < getTotalNumberOfCities() ; ++ i) for ( unsigned int j = 0 ; j < getTotalNumberOfCities() ; ++ j) if ( minimumDistanceMatrix[i][k] + minimumDistanceMatrix[k][j] < minimumDistanceMatrix[i][j] ) { minimumDistanceMatrix[i][j] = minimumDistanceMatrix[i][k] + minimumDistanceMatrix[k][j]; shortestPathCalculatorMatrix [i][j] = k; } -
然后:
void CitiesMap::findShortestPathListBetween(int source , int destination) { if( source == destination || source < 0 || destination < 0) return; if( INFINITY == getShortestPathBetween(source,destination) ) return ; int intermediate = shortestPathCalculatorMatrix[source][destination]; if( -1 == intermediate ) { pathCityList.push_back( destination ); return ; } else { findShortestPathListBetween( source, intermediate ) ; pathCityList.push_back(intermediate); findShortestPathListBetween( intermediate, destination ) ; return ; } }
P.S:pathCityList 是一个向量,在调用 findShortestPathListBetween 之前假定为空。在此调用结束时,此向量中包含所有中间节点。
有人可以指出我可能出错的地方吗?
【问题讨论】:
-
您应该提供代码输入和输出的简短示例。或者至少描述一下你得到的输出是什么样子的。
-
实际上根本不需要修改——弗洛伊德-沃歇尔的算法直接为您提供了最短路径(维基百科的文章具有高度误导性;罗伯特·弗洛伊德的公式给出了长度,沃歇尔给出了路径;加在一起,它们给出了两个都)。但是如果你只对一条最短路径感兴趣,那么这个算法无论如何都不合适,还有更有效的算法(Dijkstra 算法)。
-
@KonradRudolph 我有兴趣打印实际路径,而不是 Floyd Warshal 通常提供的路径长度,因此需要进行修改。
-
@Amit 查看我修改后的评论。维基百科的文章是错误的,FW,以其规范形式,确实提供两者。
标签: c++ algorithm shortest-path floyd-warshall