[英]Path with the shortest recovery time
問題可以通過以下方式描述:
節點網絡已崩潰,每個連接(邊緣)都有一定的恢復時間,直到它重新聯機並再次連接兩個節點。 我們的目標是找到最早運行的節點1到n之間的路徑,並在該路徑上返回最長的恢復時間。
網絡可以表示為具有無向邊的圖。
我們有三個數組:
例:
{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 )很容易:
復雜性: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.