1. 程式人生 > >【樹形背包】bzoj4033: [HAOI2015]樹上染色

【樹形背包】bzoj4033: [HAOI2015]樹上染色

51nod 樹形 led href 分享圖片 形式 子結構 正整數 EDA

仔細思考後會發現和51nod1677 treecnt有異曲同工之妙

Description

有一棵點數為N的樹,樹邊有邊權。給你一個在0~N之內的正整數K,你要在這棵樹中選擇K個點,將其染成黑色,並 將其他的N-K個點染成白色。將所有點染色後,你會獲得黑點兩兩之間的距離加上白點兩兩之間距離的和的收益。 問收益最大值是多少。

Input

第一行兩個整數N,K。 接下來N-1行每行三個正整數fr,to,dis,表示該樹中存在一條長度為dis的邊(fr,to)。 輸入保證所有點之間是聯通的。 N<=2000,0<=K<=N

Output

輸出一個正整數,表示收益的最大值。

Sample Input

5 2
1 2 3
1 5 1
2 3 1
2 4 2

Sample Output

17
【樣例解釋】
將點1,2染黑就能獲得最大收益。

題目分析

這題目第一眼看上去根本不像是背包題吧……倒像是個貪心或者奇妙結論題。

但是可以像treecut一樣,將答案按照樹上每一條邊來統計貢獻。

技術分享圖片

我們把一顆樹沿某條邊分開,看成這個樣子。

那麽顯然若知道這條邊左右兩邊黑白點各有多少個,就可以計算這個情況下的答案了。

也就是說,如果我們確定一條邊來把樹分開,那就可以依靠枚舉來確定最優答案。

觀察一下這個問題是具有最優子結構的,也就是說變成了一個樹上背包的形式:左右兩邊黑白點個數的不同情況各有體積和價值,求最大價值。

我們定義$f[x][i]$表示以$x$為根的子樹中,有$i$個黑點,這種情況的最大價值。

技術分享圖片

考慮如何轉移,

總結

一類難以通過樹形結構直接轉移的動態規劃問題,可以考慮對於邊將樹劃分為兩個部分的子問題,再分別維護答案。

【樹形背包】bzoj4033: [HAOI2015]樹上染色