更新图形时保持最短路径

时间:2017-12-14 09:56:40

标签: algorithm graph-theory

我想知道所有对之间的距离(例如dijkstra。特别是我使用的是networkx) 然后,当边缘添加到图形时,我想更新距离而无需从头开始重新计算。

如何做到这一点? 感谢

1 个答案:

答案 0 :(得分:1)

可以不重新计算所有最短路径,但仍然非常昂贵O(n^2)

因此,假设您有一个大小为n * n的距离矩阵M,其中每个条目M_{i,j}包含从节点i到节点j的距离。假设M由某种算法预先计算。

现在,如果将新边e_{i,j}添加到节点i和节点j之间的图表中且成本为w_{i,j},则检查是否w_{i,j} < M_{i,j}。如果没有,那么什么都不需要改变。但如果它成立,则图表中的最短路径可能会改善。

然后,对于每个节点对k, l,检查通过新边缘的路径是否比先前计算的路径短。这可以通过评估以下内容来完成。

M_{k,l} > min (M_{k,i} + w_{i,j} + M_{j,l} , M_{k,j} + w_{j,i} + M_{i,l})

如果这样,那么您可以将M_{k,l}替换为min (M_{k,i} + w_{i,j} + M_{j,l} , M_{k,j} + w_{j,i} + M_{i,l})

以上适用于单向图,但也可以适用于双向图。

修改1

我坚信\欧米茄(n ^ 2)也是这个问题的下限。假设图中的两个断开区域都包含n / 2个顶点。然后,如果添加连接这些区域的新边缘,则必须更新n / 2 * n / 2个最短路径,从而至少产生O(n ^ 2)运行时间。

修改2

第二个想法是尝试利用上面的等式,但首先遍历图形,以便找到必须首先更新的所有顶点对。该想法的草图如下:

从节点i开始Dijkstra。每当到达顶点k时,检查M_{k, i} + w_{i, j} < M_{k, j}是否为是,然后将k添加到必须更新的顶点集合U中。如果没有,那么你可以停止探索k之后的其他路径,因为没有顶点&#34;超过&#34; k将使用e_ {i,j}作为最短路径。

然后对节点j执行相同操作。然后根据上面的想法对U中的所有顶点对执行M的更新。