emm隨便錯
例題
沒有上司的舞會
沒有上司的舞會
定義 \(f[x][0/1]\) 表示x這個點選或者不選能夠帶來的最大的快樂值。
因爲每一個人的頂頭上司肯定不能和他一起選,也就是說,如果當前這個人選了,那麼他的直接下屬不能選,但是當前這個人不選對快樂值沒有影響,也就是。
然後題目就做完了,一個 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 爲根的子樹之外的有多少個點。
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}\}\)。