簡體   English   中英

恢復時間最短的路徑

[英]Path with the shortest recovery time

問題可以通過以下方式描述:

節點網絡已崩潰,每個連接(邊緣)都有一定的恢復時間,直到它重新聯機並再次連接兩個節點。 我們的目標是找到最早運行的節點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,因為與路徑1-2-4相比,該路徑上的最長恢復時間是5,其中最長恢復時間是10。

這里重要的是要注意,每條路徑上最長的恢復時間才是最重要的,即路徑的“長度”不是等待時間的總和,而是需要等待的最長時間的長度。兩個節點之間的連接要恢復。 每個恢復時間從t = 0計算,因此恢復時間是獨立的,順序無關緊要。

所以我們要做的就是找到每個路徑上恢復時間最短的路徑,並返回該時間。

我已經使用Dijkstra和Bellman-Ford算法解決了這個問題,但是無法真正解決如何修改算法以獲得理想結果的問題。 最多可以有10 ^ 5個連接。

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

  1. 按重量對所有邊緣進行排序,增加
  2. 循環遍歷邊,如果節點u和v在不同的不相交集中,則將它們合並為一個不相交集
  3. 如果合並后節點1和N在同一組中,則asnwer是當前邊緣的權重,我們可以突破循環。

復雜性:O(E log E + V log V)

如Photon所述,DSU是最美麗的解決方案。

另一種可能的解決方案是使用二進制搜索+ 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是不可能的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM