樹形 DP 從入土到入門


emm隨便錯

例題

沒有上司的舞會

沒有上司的舞會
定義 \(f[x][0/1]\) 表示x這個點選或者不選能夠帶來的最大的快樂值。

因爲每一個人的頂頭上司肯定不能和他一起選,也就是說,如果當前這個人選了,那麼他的直接下屬不能選,但是當前這個人不選對快樂值沒有影響,也就是。

\[\begin{cases} f_{x, 1} = f_{to, 0} \\ f_{x, 0} = \text{max}(f_{to, 1}, f_{to, 0}) \end{cases} \]

然後題目就做完了,一個 dfs 解決問題

[HAOI2009]毛毛蟲


題面自己看吧,簡化不動...


傳送門
我們令 \(f_x\) 表示以 x 爲根的子樹內最大的毛毛蟲的大小,而且 x 爲毛毛蟲的頭,那麼 \(f_x\) 的轉移方程就很顯然了。
\(cnt_x\) 爲 x 的兒子大小。
\(f_x = \max_{to \in son_x} f_{to} + 1 + \max(0, cnt_{to} - 1)\)

[ZJOI2007]時態同步

傳送門


給你一棵樹,邊有邊權,然後問你每次可以將一條邊的邊權加一,
問你至少多少次操作之後,1 這個根節點到葉子節點的路徑長度都相同。


可以讓所有葉子節點同時發出信號,然後這些信號同時到達根節點。於是我們可以自下而上的進行維護,使得每一節點所有子節點的信號同時到達該節點。

我們從根節點開始搜索,搜索到葉子節點,回溯的時候進行維護,先維護節點的所有子節點到該節點最大邊權(邊權爲葉子節點到同時到達它所需要時間)。然後維護答案,答案爲最大邊權減去所有到子節點的邊權。然後維護父節點的邊權,父節點邊權爲該節點子節點的 最大邊權+父節點到該節點的時間。然後就回溯,重複操作,到根節點爲止。

換根法

也叫二次掃描法
基本思路是先指定一個根結點,然後第一次dfs求出根節點的權值,然後第二次dfs的時候可以搞一個轉移方程由根結點轉移過去。

STA-Station

傳送門


給定一個 \(n\) 個點的樹,請求出一個結點,使得以這個結點爲根時,所有結點的深度之和最大。
一個結點的深度之定義爲該節點到根的簡單路徑上邊的數量。


\(dp_i\) 爲第 i 個結點作爲根節點時的深度之和,我們不妨令根結點爲 1,然後進行第一次dfs,求出根結點爲 1 時的深度之和,然後考慮如何轉移。

以樣例爲例

8
1 4
5 6
4 5
6 7
6 8
2 4
3 4


我們可以知道 \(dp_4\)\(12\) 考慮如何換到5這個結點。

因爲換成 5 的時候相當於 5 所在的子樹所有的結點的深度都減一,剩下的結點的深度都加一,所以我們令 \(siz_x\) 記錄 x 這個結點的子樹的大小,\(point\) 爲所有子樹的大小,然後\(x, to\) 爲 x 結點與 x 結點所到的 to( x 爲 to 的父親結點)。
那麼 \(point - siz_{to}\) 爲除了以 to 爲根的子樹之外的有多少個點。

\[dp_{to}=dp_x+(point-siz_{to}) - siz_{to} \]

Great Cow Gathering G

傳送門


給你一棵樹,邊有邊權,讓你求出一個到其他所有點的路徑和最小的那個點的路徑和。


和上一個題差不多,就是每每條邊有邊權,也就是說我們可以通過讓 siz 數組維護的值改變一下來 AC 這道題。

考慮 siz 數組中存貯每個牛棚的以及他的子樹中,一共有多少頭牛,剩下的轉移就和上邊那個題差不多了。

Choosing Capital for Treeland

傳送門


給你一棵樹,但是樹上的邊都是單向邊,問以 i 點爲根的時候,爲了能夠遍歷到每個點,需要修改多少條邊的方向。


建圖的時候按照雙向邊建圖,正向和反向邊分別標記,然後可以很輕鬆的求出 1 爲根時的答案,轉移的時候就判斷 x 與 to 之間連的邊是正向邊還是反向邊就行了。

樹點染色類

Cell Phone Network G

傳送門
雙倍經驗

一開始的時候還以爲和黑白染色差不多的那種,但是仔細一想就會發現不對勁。

我們設 \(f_{x,0/1/2}\) 分別爲:

  • \(f_{x,0}\) 表示 i 被自己覆蓋 的最小花費
  • \(f_{x,1}\) 表示 i 被兒子覆蓋 的最小花費
  • \(f_{x,2}\) 表示 i 被父親覆蓋 的最小花費

可以發現,x 自己覆蓋的時候,也就是 x 自己建信號塔的時候,他的兒子們建或不建都可,所以轉移方程就是 \(f_{x,0} += \min \{ f_{son,0}, f_{son,1},f_{son,2}\}\)

可以發現,自己被兒子覆蓋的時候只需要被其中一個兒子覆蓋就可以了,所以轉移方程就是: \(f_{x.1} = f_{sx.0} + \sum \big(\min (f_{son,0}, f_{son,1})\big )\)

可以發現,他自己如果被父親覆蓋,說明他的兒子一定沒有被他自己覆蓋,所以狀態轉移方程就是: \(f_{x,2} += \min \{ f_{son. 0}, f_{son.1}\}\)

樹形揹包

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章