容斥原理與子集卷積(三)
這次介紹一個和最小生成樹問題很類似的,名叫斯坦納樹的問題。
斯坦納樹有很多版本,這裡我們說的是在圖論中的斯坦納樹問題。
斯坦納樹(Steiner Tree)
定義有點複雜,容我先編個故事。
國家A和國家B在打仗,國家B無情地對國家A發動了地毯式轟炸,破壞了國家A城市間的所有道路。
為了儘快恢復,國家A列出了某些重要城市的名單,並研究出了修復每條道路的成本。如下圖所示:
現在問,如何在最小成本的情況下,修復道路,使得這些重要城市保持連通。比如上圖中,按如下的選擇,就可以達到最小的成本:
顯然,我們最後的結果一定是棵樹。但和最小生成樹不同的是,我們不用保證所有店都連通,只需要保證部分點連通即可。這就是斯坦納樹問題。
定義:給一個連通無向圖 ,和邊權 。現在有一個點集 ,求一個邊權和最小的連通子圖 ,使得 。其中 就被稱為斯坦納樹。
斯坦納樹也是一個NPH問題。
下面給出斯坦納樹的若干種解法。
暴力解法
在一個放棄思考的情況下,不難得出一個暴力的解法:直接枚舉點子集,而後跑個最小生成樹。這樣做的複雜度是 ,其中 。
顯然暴力做法在 很大, 很小的時候,是非常不理智的。鑒於只需要考慮 中的點,我們可以從動態規劃的角度來解決。
動態規劃
動態規劃可以優美的做到 ,至於怎麼實現,由於我主要想介紹容斥原理(我懶),所以就留給大家做練習啦。
提示一下:狀態維護兩維,一維是當前的集合,一維是當前的根。
容斥原理做法
特別提示:這裡的介紹的容斥原理做法,只能解決邊權都是 的情況,即 ,無權圖。
為了方便處理,我們需要將問題定義成判定型問題:
定義(無權斯坦納樹):給一個無向圖 ,一個點子集 ,和一個非負數 。我們的目的是判斷是否存在一棵最多 條邊的樹 ,使得 。
在本系列之前的文章中,我們用容斥原理統計了一個圖的哈密頓圈的個數。
我們發現,相比研究圈(circle)、路徑(path),通過研究遊走(walk),來進行容斥是個更不錯的主意。
於是,我們在這個問題中,也嘗試通過遊走來分析。
與之前的統計哈密頓圈不同,這裡我們研究的遊走是分支遊走(branching walk)。
定義(分支遊走):一個無向圖 的分支遊走定義為一個二元組 ,其中 是一棵有根有序樹(rooted ordered tree),並且 是一個同態(homomorphism)映射,即, ,有 。通常稱 為 的長度。
舉個例子,如下圖所示:
定理4:拿出 中的任意一點 。如果圖 包含了一棵樹 ,並且 , ,當且僅當,圖 包含一個從 開始的分支遊走 ,滿足 , 。
定理4的是可以直觀感受到的。
事實上,由於一棵樹本身就是一個分支遊走,所以如果一棵邊數小於等於 的樹覆蓋了 中所有點,那麼就存在了一個長度不超過 的分支遊走(就是這棵樹本身)。如果一個長度大小等於 的分支遊走覆蓋了 中所有點,那麼這個分支遊走的生成樹就是邊數不大於 的一棵斯坦納樹。
如下圖所示:
有了定理4,我們就只需要統計,圖中有多少從 開始,並且長度為 的分支遊走,覆蓋了 中所有點。
我們照著葫蘆畫瓢:
- 令全集 表示從 開始,長度為 的所有分支遊走。
- 對 ,令 ,即訪問了 的所有 中的分支遊走。
- 我們的目標就是計算
根據定理2,我們有:
於是我們的目標就是計算 ,既是,從 出發,長度為 ,不訪問 中的任意一點的分支遊走的方案數。
定理5:對於 , 可以在 的複雜度內計算出來,其中 。
證明:我們使用動態規劃來證明這個複雜度。令 。令 表示在 中從 出發,走長度為 的分支遊走的方案數。有轉移方程:
相當於枚舉了 作為 的第一個兒子。如下圖所示:
狀態數是 ,轉移數是 ,所以求解 的複雜度就是 。
綜上,我們便能通過統計分支遊走的數量,來判斷是否存在小於 的斯坦納樹。
定理6:無權斯坦納樹問題可以在 的時間內解決。
推薦閱讀:
※正方形中如何安排一些線段,使總長度最短,同時擋住所有經過正方形的直線?
※一個 n*n 的方格陣,至多塗黑多少個使得不存在 4 個黑格為某矩形頂點?
※N個相同的球,放入M個相同的盒子中,允許有盒子為空,請問有多少種方法?
※如果鴿籠原理/抽屜原理不存在,數學/科學會發生怎樣的改變?
※任何一個置換寫成對換的乘積時對換個數的奇偶性不變?
TAG:算法 | 数学 | 组合数学Combinatorics |