首先,選擇任意乙個度數大於\(1\)的節點為根的最優的答案都是固定的,具體證明這裡不加贅述。
我們仔細研究,他只要求根節點到葉子節點的最後乙個有色節點的顏色。我們對第\(x\)號節點染色,意味著我們把所有它子樹中的葉子節點最近的乙個有色節點的顏色就發生了改變。顯然,兒子越多的節點價效比越高。
因此,我們定義\(dp_\)為第\(i\)號節點染成第\(j\)種顏色的最小花費,那麼對於\(j\)號節點是他的兒子,可以把他的兒子染成異色,也可以讓兒子的顏色與他一致,有轉移方程如下:
\(dp_\) += \(min(dp_ - 1 , dp_)\)
\(dp_\) += \(min(dp_ - 1 , dp_)\)
```cpp
#include #include using namespace std;
const int maxn = 1e4 + 5;
int head[maxn] , to[maxn << 1] , nxt[maxn << 1] , cnt , n , m;
int c[maxn] , dp[maxn][2];
void add(int x , int y)
void read(int &x)
while(s >= '0' && s <= '9')
x *= f;
}void dfs(int x , int fa)
dp[x][0] = dp[x][1] = 1;
for (int i = head[x]; i; i = nxt[i])
}int main()
dfs(m , m);//姑且選m為根節點
printf("%d" , min(dp[m][0] , dp[m][1]));
return 0;
}```
CQOI2009 葉子的染色 樹形dp
給一棵 m 個結點的無根樹,你可以選擇乙個度數大於 1 的結點作為根,然後給一些結點著以黑色或白色。方案應保證根結點到每個葉子的簡單路徑上都至少包含乙個有色結點。對於每個葉結點 u 定義 c u 為從根結點從 u 的簡單路徑上最後乙個有色結點的顏色。給出每個 c u 的值,設計著色方案,使得著色結點...
CQOI2009 葉子的染色 貪心或動規
給一棵m個結點的無根樹,你可以選擇乙個度數大於1的結點作為根,然後給一些結點 根 內部結點和葉子均可 著以黑色或白色。你的著色方案應該保證根結點到每個葉子的簡單路徑上都至少包含乙個有色結點 哪怕是這個葉子本身 對於每個葉結點u,定義c u 為從根結點到u的簡單路徑上最後乙個有色結點的顏色。給出每個c...
CQOI2009 葉子的染色 性質 樹形Dp
online judge bzoj1304,luogu p3155 label 無根樹,樹形dp 給定一棵 n 個節點的無根樹,它一共有 k 個葉子節點。你可以選擇乙個度數大於1的節點作為根,並對整棵樹進行染色 對於每個節點可以染黑 白,或選擇不染 著色方案需滿足以下約束 1.每個葉子節點到樹根的路...