所有对的最短路径长度为无向加权稀疏图
All pairs shortest path lengths for undirected weighted sparse graph
查找无向加权稀疏图的所有对最短路径长度的最佳算法是什么?具体来说,权重是节点之间的距离(因此为正)。请注意,我只需要路径长度(即不需要路径本身)。我的图形很稀疏,因此它存储为邻接列表。
我找到了Dijkstra,Floyd-Warshall,Johnson等,但似乎没有一个是最适合我的目的。在Dijkstra的情况下,你对所有顶点运行单一源版本,Floyd-Warshall 用于密集图,Johnson 用于定向。
我专门在寻找C++中的实现。
Johnson 的算法似乎最适合稀疏图(如果 |V|> |E|它归结为 O(V^2logV),而不是带有 FW 的 O(V^3)。但是,由于 Johnson 算法将第一步用于使权重为非负值(您不需要),因此您可以按照正确指出的方式只运行第二步,这基本上只是每个节点的 Dijkstra。这应该只取O(VElogV),如上一张幻灯片中所述。我不确定我是否可以证明这是最好的解决方案,但如果有一个更好的解决方案(用于查找非负权重的最短路径) - 我希望约翰逊算法在重写权重后使用它。
它适用于有向图的事实不应该打扰您 - 您只需通过来回转换具有 2 条有向边的每个无向边(使用简单的 O(E) 时间)即可将无向图转换为有向图。也就是说 - 除非您有空间限制。
由于它是一个无向加权稀疏图,它与道路网络非常相似,所以我不认为(根据经验)有比 Dijkstra 更好的算法。看看双向dijkstra,如果你有足够的RAM,你可以缓存每个节点的最短路径树(SPT),然后在点i的SPT与点j的SPT之间进行"匹配",其中i != j。
我还没有测试过它,但 2013 年的这篇论文声称以 47 倍的优势击败了 Dijkstra:
Urakov A. R., Timeryaev T. V.:高维稀疏图的全对最短路径算法:
与Dijkstra算法相比,该算法将APSP的求解速度平均提高了47倍。对于每个和所有测试图,该算法都比Dijkstra算法快(最小速度快34倍)。在测试期间,顶点度数增加到最大值 17。这意味着在拆卸过程中,顶点移除的复杂性仅略有增加。
- 内存效率表示最短路径的方法?
- 用于查找网格中最短路径的算法
- 查找最短路径算法
- BFS 打印最短路径
- 使用 Dijkstra 算法跟踪两个节点之间的最短路径
- 使用C++具有两个数字的最短路径算法.(C++)
- 使用迭代深度优先搜索算法的未加权图的最短路径
- 如何仅在 2 个节点之间获取最短路径,给定邻接列表有向图?
- 如何使用贝尔曼-福特算法返回所有具有捆绑重量的最短路径?
- 使用优先级队列查找所有与 Dijkstra 相同的最短路径
- 尝试在图形中查找最短路径时的无限循环
- C++计算有向图中的最短路径
- 使用BFS存储和打印最短路径
- 如何制作由原始图形的最短路径边组成的新图形
- 有没有一种方法可以使用弗洛伊德-沃歇尔算法给出最短路径,其中存在负权重循环而不允许重叠边缘?
- 加权图的开始和结束的最短路径
- 所有对的最短路径长度为无向加权稀疏图
- 加权无向Boost图上的Floyd-Warshall(所有对最短路径)
- 圆形、无向、未加权图中的最短路径
- 加权图最短路径设计