簡體   English   中英

最小的生成樹以最小化成本

[英]Minimum spanning tree to minimize cost

有人可以幫我解決這個問題嗎?

我們有一組E道路,一組H公路和一組V不同的城市。 我們還有與每條道路i相關的成本x(i)和與每條公路i相關的成本y(i)。 我們要建立連接城市的道路,條件是任何一對城市之間總有一條道路,而且我們最多只能修建一條高速公路,這可能比一條道路便宜。

集合E和集合H不同,並且它們各自的成本無關。

設計一種算法來構建道路(最多具有一條高速公路),以最小化總成本。

因此,我們擁有的是邊的完全連接圖。

解決步驟:

  1. 查找僅道路的最小生成樹,並將其視為最低成本。
  2. 在道路圖上添加一條高速公路,然后再次計算最小生成成本樹。
  3. 比較第2步的成本和最小的成本(如果較小的話)。
  4. 刪除高方式。
  5. 返回第2步,然后針對每個高速公路再次執行該步驟。

O(納米)= m * mst_cost(n)

使用Prim或Kruskal來構建MST: O(E log V)

問題是最多只能有1條高速公路。

1.天真的方法來解決這個問題:

對於每個可能的高速公路,從頭開始構建MST。

該解決方案的時間復雜度: O(HE log V)

2.替代

想法:如果您構建了一個MST,並且您有一個以前從未考慮過的可用邊緣,則可以使用更好的MST來優化MST。

假設新邊連接(u,v) 如果使用此邊緣,則可以刪除MST中頂點uv之間路徑中最昂貴的邊緣。 您可以在O(V)時間中天真地找到路徑。

使用此想法,時間復雜度是建立初始MST O(E log V)的成本,以及嘗試使用每條H高速公路細化MST的時間。 因此,總算法復雜度為O(E log V + HV) ,這比第一個解決方案要好。

3.優化細化

不用第二種方法來做簡單的路徑搜索方法,我們可以找到一種更快的方法。 一個相關的問題是LCA(最低共同祖先)。 解決LCA的一個好方法是使用跳轉指針。 首先,您要樹根,然后每個頂點將具有指向根的跳轉指針(1步,2步,4步等)。預處理可能會花費O(V log V)時間,而找到2個頂點的LCA為O(log V)最壞的情況(盡管實際上是O(log (depth of tree))通常更好)。

一旦找到LCA,就會隱式地為您提供頂點uv之間的路徑。 但是,找到最昂貴的邊來刪除可能會很昂貴,因為遍歷路徑非常昂貴。

在一維問題中,可以采用范圍最大查詢(RMQ)。 這使用段樹來解決O(log N)時間中的RMQ。

我們有一棵樹,而不是一維空間(如數組)。 但是,我們可以應用相同的想法,並構建一個類似於段樹的結構。 實際上,這等效於與每個跳轉指針捆綁額外的一條信息。 為了找到LCA,樹中的每個頂點將具有指向根的log(tree depth)跳轉指針。 我們可以使用跳轉指針捆綁所跳過的邊緣的最大邊緣權重。 添加此信息的成本與首先創建跳轉指針相同。 因此,對LCA算法的略微改進使我們能夠在O(log (depth))時間上找到頂點uv之間的路徑上的最大邊緣權重。

最后,綜合起來,該第三種解決方案的算法復雜度為O(E log V + H log V)或等效地O((E+H) log V)

暫無
暫無

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

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