【題目描述】
給一棵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 有邊相連。
【輸出】
僅乙個數,即著色結點數的最小值
【樣例輸入】
5 3010
1 42 5
4 53 5
【樣例輸出】
2這道題顯然 採用樹形dp。
當我們在更新的時候,我們發現我們需要知道子樹還缺少什麼顏色。
因此我們定義三個狀態:dp[u][0,1,2]。分別表示子樹缺少白色,黑色或者不缺顏色的最小代價。
那麼:dp[
u][1
]=∑m
in(d
p[v]
[1],
dp[v
][2]
)dp[u][1]=\sum min(dp[v][1],dp[v][2])
dp[u][
1]=∑
min(
dp[v
][1]
,dp[
v][2
])d p[
u][0
]=∑m
in(d
p[v]
[0],
dp[v
][2]
)dp[u][0]=\sum min(dp[v][0],dp[v][2])
dp[u][
0]=∑
min(
dp[v
][0]
,dp[
v][2
])d p[
u][2
]=mi
n(∑d
p[v]
[2],
dp[u
][1]
+1,d
p[u]
[0]+
1)
dp[u][2]=min(\sum dp[v][2],dp[u][1]+1,dp[u][0]+1)
dp[u][
2]=m
in(∑
dp[v
][2]
,dp[
u][1
]+1,
dp[u
][0]
+1)**:
#include
#include
#include
#include
#include
#include
#include
#include
#define re register
using
namespace std;
int a,b,n,m,k;
struct nodee[
200001];
int f[
200001];
int nxp[
200001];
int cnt=0;
int du[
10001];
int root;
inline
void
add(
int u,
int v)
inline
intred()
int dp[
10001][
3];int
dfs(
int u,
int fa)
dp[u][2
]=min(dp[u][2
],min(dp[u][0
],dp[u][1
])+1
);}int
main()
2104 葉子的顏色 樹形dp
題面可自行跳過 描述 給一棵m個結點的無根樹,你可以選擇乙個度數大於1的結點作為根,然後給一些結點 根 內部結點和葉子均可 著以黑色或白色。你的著色方案應該保證根結點到每個葉子的簡單路徑上都至少包含乙個有色結點 哪怕是這個葉子本身 對於每個葉結點u,定義c u 為從根結點到u的簡單路徑上最後乙個有色...
CQOI2009 葉子的染色 樹形dp
給一棵 m 個結點的無根樹,你可以選擇乙個度數大於 1 的結點作為根,然後給一些結點著以黑色或白色。方案應保證根結點到每個葉子的簡單路徑上都至少包含乙個有色結點。對於每個葉結點 u 定義 c u 為從根結點從 u 的簡單路徑上最後乙個有色結點的顏色。給出每個 c u 的值,設計著色方案,使得著色結點...
樹形DP 樹形DP四例
是時候練一下dp了!我的題單 portkey f u,if fu,i 表示以u uu為根節點的子樹中保留i ii條樹枝的最大蘋果數 f u,i max f max f fu,i max這些題是菜,但也不能輕視啊!include using namespace std define in read i...