找到无向加权稀疏图的所有对最短路径长度的最佳算法是什么?具体而言,权重是节点之间的距离(因此是正的)。请注意,我只需要路径长度(即不是路径本身)。我的图表是稀疏的,因此它存储为邻接列表。
我找到了Dijkstra,Floyd-Warshall,Johnson等,但它们似乎都没有达到我的目的。在Dijkstra的情况下,您在所有顶点上运行单一源版本,Floyd-Warshall用于密集图形,而Johnson用于定向。
我特意在C ++中寻找实现。
答案 0 :(得分:1)
Johnson's algorithm似乎最适合稀疏图(如果| V |> | E |它归结为O(V ^ 2logV),而不是O(V ^ 3)和FW)。然而,由于Johnson的算法花费了第一步使权重非负(你不需要),你可以只运行你正确指出的第二步,这实际上只是来自每个节点的Dijkstra。这应该只需要按照here, on the last slide所述的O(VElogV)。我不确定我能证明它是最好的解决方案,但是有一个更好的解决方案(用于寻找非负权重的最短路径) - 我希望Johnsons算法在重写权重后使用它。
它在有向图上工作的事实不应该打扰你 - 你可以简单地通过转换每个无向边缘并使用2个有向边来回(使用简单的O(E)时间)将无向图转换为有向图。 。那是 - 除非你有空间限制。
答案 1 :(得分:0)
由于它是一个无向加权稀疏图,它与道路网非常相似,所以我不认为(根据经验)有比Dijkstra更好的算法。看看双向dijkstra,如果你有足够的RAM,你可以缓存每个节点的最短路径树(SPT),然后在点i的SPT和点j的SPT之间进行“匹配”,其中i!=学家
答案 2 :(得分:0)
我还没有测试过,但是从2013年开始,这篇论文宣称击败Dijkstra的因子为47:
Urakov A. R., Timeryaev T. V.: ALL-PAIRS SHORTEST PATHS ALGORITHMFOR HIGH-DIMENSIONAL SPARSE GRAPHS:
与Dijkstra算法相比,所提出的算法加速了APSP的求解速度平均快47倍。对于每个和所有测试图,算法比Dijkstra算法更快(最小加速速度快34倍)。在测试期间,顶点度数增加到最大值17.这意味着顶点移除的复杂性在反汇编期间仅略有增加。