所有对的最短路径长度为无向加权稀疏图

All pairs shortest path lengths for undirected weighted sparse graph

本文关键字:加权 最短路径      更新时间:2023-10-16

查找无向加权稀疏图的所有对最短路径长度的最佳算法是什么?具体来说,权重是节点之间的距离(因此为正)。请注意,我只需要路径长度(即不需要路径本身)。我的图形很稀疏,因此它存储为邻接列表。

我找到了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。这意味着在拆卸过程中,顶点移除的复杂性仅略有增加。