樹的最大割問題 演算法設計第十章習題9

2021-07-05 13:41:39 字數 545 閱讀 4848

題意:給定一棵有偶數個結點的樹,樹的每條邊給定乙個權值。求這棵樹的最大割,要求樹的兩部節點數量相同。

思路:一般圖上的最大割問題是np完全的,歸約可以從partition問題來歸約(見krap的21的npc問題那篇**)。而在樹上,這是可以在多項式時間內進行解決的。思路就是樹形dp。

具體來說可以設dp[x][k]表示在以x為根的子樹內,x所在的部有k個節點形成的最大割值。那麼dp[x][k]的值可以由兒子的情況來決定,類似揹包的思想。對每個兒子y,可以通過分類x和y是否屬於同一部來構造狀態轉移方程。具體來說,對於dp[y][b],可以更新dp[x][k] = max(dp[x][k] , dp[x][k-b]+dp[y][b] , dp[x][k-(num(y)-b)]+dp[y][b]+w(x,y))。上述中間的式子表示x和y同屬於一部,所以x所在部的點數加上y所在部的點數即可,而且x和y直接的權值不計入;而後邊的式子則表示x和y不屬於一部,num(y)表示y所在子樹的結點總數,w(x,y)表示x和y之間的權值。

這樣一來,每個結點的更新時間的n^2的,又一共有o(n)個結點,所以總共的時間複雜度是o(n^3)的。

第十章 泛型演算法

特殊迭代器 插入迭代器 被繫結到乙個容器上,可用來向容器插入元素 流迭代器 被繫結到輸入 輸出流上,可用來遍歷所關聯io流 反向迭代器 向後而不是向前移動,除了forward list,容器都擁有它 移動迭代器 不是拷貝其中的元素,而是移動它們 插入迭代器操作 it t 在it指定的當前位置插入t,...

第十章 python的css

一種快速定位元素的方法 beautifulsoup scrapy 舉例 解釋 選擇所有元素.class 舉例 intro 解釋 選擇所有class intro 的元素 id 舉例 firstname 解釋 選擇所有id firstname 的元素element 舉例 p 解釋 選擇所有元素 not ...

c primer 筆記,第十章(泛型演算法)

accumulate第三個三處所傳的儲值的型別必須定義了 運算子,例如 將空串當作乙個字面值傳給第三個引數是不可以的 會導致編譯錯誤,const char 上並沒有定義 運算子 string sum accumulate v.cbegin v.cend string上定義了 運算子 string s...