我很难理解Johnson Algorithm的用处。我认为这个问题听起来对于在这方面有所了解的人来说真的很愚蠢,但我无法弄明白。根据维基百科,约翰逊算法使用Bellman Ford算法将边缘权重转换为非负权重,然后使用Dijkstra算法找到最短路径。但Bellman Ford算法也是一种找到最短路径的算法。为什么我们不使用从Bellman Ford算法得到的最短路径?
答案 0 :(得分:7)
Bellman-Ford算法找到从单个源到所有图顶点的最短路径(“单源最短路径”)。 Johnson的算法找到从每个顶点到每个其他顶点的最短路径(“所有对最短路径”),因此它相当于从图中的每个可能的起始顶点运行Bellman-Ford。
答案 1 :(得分:1)
我知道我参加这个派对已经很晚了,但我偶然发现了这个问题,因为我只是问自己同样的事情。
为了更好地理解,我想指出约翰逊算法的第一步实际上创建了一个新图。它通过巧妙地使用Bellman-Ford算法将原始图形(可以具有负边缘)转换为不具有负边缘的不同(但是等效)图形来实现这一点。这个新图现在可以安全地与Dijkstra算法一起使用。然后使用Dijkstra算法有效地计算所有对最短路径"另外两个答案提到了。
可在此处找到一个很好的解释:http://www.geeksforgeeks.org/johnsons-algorithm/
答案 2 :(得分:0)
Bellman Ford算法用于查找从单个顶点(源)到所有其他顶点的最短路径,而Johnson算法用于查找所有对最短路径。如果要在C中实现Johnson算法,请通知我。 / p>