是否可以使用邻接列表对Floyd Warshall进行编码?我必须处理来自文本文件的一百万个顶点,因此,邻接矩阵不是解决方案。任何实施已经可用?请帮忙。
答案 0 :(得分:2)
你不能将Floyd Warshall与邻接列表一起使用,因为当它起作用时,会产生新的边缘。
示例:
首先,您的图表有2个边(1-2,2-3)。所以你初始化邻接矩阵:
adj [1] [2] = 1; (表示边缘在1和2之间)
adj [2] [3] = 1; (意味着在3和2之间有边缘)
adj [1] [3] = + oo; (表示1和3之间没有边缘)
当FW工作时,边缘1-3将被添加,因为adj [1] [2] + adj [2] [3]< adj [1] [3] => adj [1] [3] = 2(表示边缘在1和3之间);
我不知道你的图表中有多少边缘和时间限制要解决,但如果你需要计算图表中所有对之间的最短路径,你可以做| V |具有复杂性的优先级队列的Dijkstra是| V | * max(| V | log | V |,| E |)优于Floyd Warshall的| V | ^ 3。
答案 1 :(得分:1)
Floyd Warshall Implementation using adjacency list但它在内部转换算法之前将邻接列表转换为矩阵。如果你的图形不稀疏,那么使用adj列表而不是矩阵将无济于事,因为无论如何你需要扫描所有边缘。但是如果您的图形非常稀疏,那么您可能需要考虑从每个节点运行Dijkstra'a最短路径算法而不是使用Floyd Warshall。正如Anh Huynh在其他回复中提到的,如果你肯定知道| E | 〜| V | log ^ k | V |其中0 <= k然后为每个节点运行Dijkstra的算法将比Floyd Warshall提供更好的时间复杂度。