[CQOI2009]叶子的染色(树形dp)
鏈接:https://ac.nowcoder.com/acm/problem/19914
來源:牛客網
題目描述
給一棵m個結點的無根樹,你可以選擇一個度數大于1的結點作為根,然后給一些結點(根、內部結點和葉子均可)著以黑色或白色。你的著色方案應該保證根結點到每個葉子的簡單路徑上都至少包含一個有色結點(哪怕是這個葉子本身)。
對于每個葉結點u,定義c[u]為從根結點從U的簡單路徑上最后一個有色結點的顏色。給出每個c[u]的值,設計著色方案,使得著色結點的個數盡量少。
輸入描述:
第一行包含兩個正整數m, n,其中n是葉子的個數,m是結點總數。結點編號為1,2,…,m,其中編號1,2,… ,n是葉子。
以下n行每行一個0或1的整數(0表示黑色,1表示白色),依次為c[1],c[2],…,c[n]。
以下m-1行每行兩個整數a,b(1 ≤ a < b ≤ m),表示結點a和b 有邊相連。
輸出描述:
僅一個數,即著色結點數的最小值。
示例1
輸入
復制
5 3
0
1
0
1 4
2 5
4 5
3 5
輸出
復制
2
給定的c數組中的值都是葉子節點。一開始沒看清楚,怎么也想不出來。我們用dp[i][0/1]來代表第i個結點染成白色或者黑色之后,以它為根的子樹最小的染色次數。
對于葉子節點,如果他是白色,就將dp[i][0]設置為1,否則就將dp[i][1]設置為無窮大。反之也一樣。
對于當前節點,如果它染成白色,那么它的子樹中某個染成白色點就可以不用染色了,這樣的話結果是更優的。這樣的話,就不斷的尋找最優值。
狀態轉移方程:
dp[u][1]+=min(dp[to][1]-1,dp[to][0]);
dp[u][0]+=min(dp[to][0]-1,dp[to][1]);
代碼如下:
努力加油a啊,(o)/~
總結
以上是生活随笔為你收集整理的[CQOI2009]叶子的染色(树形dp)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 黑白树(牛客网+树形dp)
- 下一篇: [HAOI2015]树上染色(树形dp,