最小K度限制生成樹

算法目的:給出V0,K 和一個帶邊權的無向圖,求出在V0 的度數最多爲K 的限制下的最小生成樹

預備知識:最小生成樹、動態規劃

定義強制K度最小生成樹爲所有生成樹中V0 的度數爲K 的權值最小的生成樹

大概思路:先把V0V0 有關的邊都刪除,假設現在的圖分成了M 個聯通塊,則我們可以得知對於任何生成樹V0 的度數至少爲M 。那麼我們依次求出強制M度最小生成樹強制M+1度最小生成樹強制K度最小生成樹,這些生成樹的最小值就是最小K度限制生成樹

定理:任意強制K+1度最小生成樹一定可以由某個強制K度最小生成樹替換一條邊得到

定理的證明:我們可以把強制K度最小生成樹想象成V0 連着K 顆樹,設新加入的邊爲(A1,B1),(A2,B2)

易知,不存在(Ai,Bi) 在同一棵樹中。因爲如果有,則兩個生成樹中至少有一個不是最小生成樹
同理,也不存在(Ai,Bi) 跨越不同的樹。
所以可以得出所有的(Ai,Bi) 滿足Ai=V0Bi=V0

又因爲經過替換之後V0 的度數只增加了1,所以若加入了X條這樣的邊,就必須刪掉X-1條這樣的邊
由於原來的樹是強制K度最小生成樹,所以一定不存在在某棵樹中換一個點與V0 相連使得答案變小的情況
所以可以得出,所有的這樣添加和刪除操作必然都是在同一棵樹中進行的
可以證明原來這棵樹與V0 相連的邊一定不會被替換掉,所以X-1=0,X=1
也就是說,強制K+1度最小生成樹是從強制K度最小生成樹刪一條邊再加一條邊產生的
證畢

有了這個定理,我們就可以更加快速的求出強制K度最小生成樹

算法步驟:1.先求出M ,並對每個聯通快求出一個最小生成樹,然後選擇一個權值最小的邊使其和V0 相連,這就是強制M度最小生成樹

     2.然後考慮求強制M+1度最小生成樹,根據定理,這個生成樹是由上一個生成樹替換一條邊得到。當我們加入(V0,S) 時,我們一定會選擇刪除現在從V0S 路徑上邊權最大的那個,所以我們O(N)掃一遍所有點,進行一次DP,求出從V0 到所有點的路徑最大權值是多少

     3.接着掃一遍所有沒被加入的與V0 相連的邊,選擇一條加入之後最優的邊(邊權-被替換掉的邊權最小),把它加入進來,然後把原來的邊加入,這就得到了強制M+1度最小生成樹

     4.重複上面的過程,直到求出了強制K度最小生成樹,則最小K度限制生成樹一定在這些答案當中

算法複雜度:最開始求出最小生成樹O(ElogE),接着進行K次替換,每次替換需要O(N)DP,再O(E)比較。所以總的時間複雜度爲O(ElogE+K(N+E))

代碼?等我寫了再貼吧

發佈了170 篇原創文章 · 獲贊 42 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章