[英]Minimum spanning tree to minimize cost
有人可以幫我解決這個問題嗎?
我們有一組E道路,一組H公路和一組V不同的城市。 我們還有與每條道路i相關的成本x(i)和與每條公路i相關的成本y(i)。 我們要建立連接城市的道路,條件是任何一對城市之間總有一條道路,而且我們最多只能修建一條高速公路,這可能比一條道路便宜。
集合E和集合H不同,並且它們各自的成本無關。
設計一種算法來構建道路(最多具有一條高速公路),以最小化總成本。
因此,我們擁有的是邊的完全連接圖。
解決步驟:
O(納米)= m * mst_cost(n)
使用Prim或Kruskal來構建MST: O(E log V)
。
問題是最多只能有1條高速公路。
對於每個可能的高速公路,從頭開始構建MST。
該解決方案的時間復雜度: O(HE log V)
想法:如果您構建了一個MST,並且您有一個以前從未考慮過的可用邊緣,則可以使用更好的MST來優化MST。
假設新邊連接(u,v)
。 如果使用此邊緣,則可以刪除MST中頂點u
和v
之間路徑中最昂貴的邊緣。 您可以在O(V)
時間中天真地找到路徑。
使用此想法,時間復雜度是建立初始MST O(E log V)
的成本,以及嘗試使用每條H
高速公路細化MST的時間。 因此,總算法復雜度為O(E log V + HV)
,這比第一個解決方案要好。
不用第二種方法來做簡單的路徑搜索方法,我們可以找到一種更快的方法。 一個相關的問題是LCA(最低共同祖先)。 解決LCA的一個好方法是使用跳轉指針。 首先,您要樹根,然后每個頂點將具有指向根的跳轉指針(1步,2步,4步等)。預處理可能會花費O(V log V)
時間,而找到2個頂點的LCA為O(log V)
最壞的情況(盡管實際上是O(log (depth of tree))
通常更好)。
一旦找到LCA,就會隱式地為您提供頂點u
和v
之間的路徑。 但是,找到最昂貴的邊來刪除可能會很昂貴,因為遍歷路徑非常昂貴。
在一維問題中,可以采用范圍最大查詢(RMQ)。 這使用段樹來解決O(log N)
時間中的RMQ。
我們有一棵樹,而不是一維空間(如數組)。 但是,我們可以應用相同的想法,並構建一個類似於段樹的結構。 實際上,這等效於與每個跳轉指針捆綁額外的一條信息。 為了找到LCA,樹中的每個頂點將具有指向根的log(tree depth)
跳轉指針。 我們可以使用跳轉指針捆綁所跳過的邊緣的最大邊緣權重。 添加此信息的成本與首先創建跳轉指針相同。 因此,對LCA算法的略微改進使我們能夠在O(log (depth))
時間上找到頂點u
和v
之間的路徑上的最大邊緣權重。
最后,綜合起來,該第三種解決方案的算法復雜度為O(E log V + H log V)
或等效地O((E+H) log V)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.