恢复时间最短的路径

时间:2019-03-31 11:29:56

标签: algorithm graph shortest-path dijkstra bellman-ford

可以通过以下方式描述问题:

节点网络已崩溃,并且每个连接(边缘)都有一定的恢复时间,直到它重新联机并再次连接两个节点为止。我们的目标是找到最早运行的节点1至n之间的路径,并返回该路径上最长的恢复时间。

网络可以表示为具有无向边的图。

我们有三个数组:

  1. 第一个包含原始顶点
  2. 第二个包含目标顶点
  3. 第三个包含每个连接(边缘)的恢复时间
  

示例:

     

{1,2,2,3},{2,3,4,4},{1,5,10,2}

     

节点1和2之间的连接的恢复时间为1,等等。

     

从1到n = 4的最佳路径是1-2-3-4,因为与最长的恢复时间是10的路径1-2-4相比,该路径上的最长恢复时间是5

这里重要的是要注意,只有每条路径上最长的恢复时间才是重要的,即路径的“长度”不是等待时间的总和,而是一条路径具有的最长时间等待两个节点之间的连接恢复。每个恢复时间都是从t = 0计算得出的,因此恢复时间是独立的,顺序无关紧要。

所以我们在这里要做的是从每个路径的最大恢复时间中找到具有最小恢复时间的路径,然后返回该时间。

我已经使用Dijkstra和Bellman-Ford算法解决了这个问题,但是我并不能真正围绕如何修改算法来获得期望的结果。最多可以有10 ^ 5个连接。

2 个答案:

答案 0 :(得分:0)

使用DSU(https://en.wikipedia.org/wiki/Disjoint-set_data_structure)很容易:

  1. 按重量排序所有边缘,增加
  2. 环通边缘,如果节点u和v位于不同的不交集中,请将它们合并为一个不交集
  3. 如果合并节点1和N在同一集合中,则nswer是当前边的权重,因此我们可以跳出循环。

复杂度:O(E log E + V log V)

答案 1 :(得分:0)

DSU是最漂亮的解决方案,如Photon所述。

另一种可能的解决方案是使用二进制搜索+ dfs / bfs / Dijkstra / Bellman-Ford /

此算法将以最多log(最大可能的边缘成本)运行DFS / BFS。

该算法的工作原理如下:

lo = 0, hi = largest cost from any edge from a graph
mid = dummy_value

while ( lo < hi ):
    mid = (lo + hi) / 2
    check if there is a path from source to destination using only edges with cost <= mid
    if there is a path:
        hi = mid
    else:
        lo = mid + 1

return mid

使用DSU的解决方案具有更好的运行时复杂性,但这引入了对答案进行二进制搜索的想法,这是解决问题的经典想法。在某些问题上,无法执行DSU。