CQOI2009 葉子的染色 樹形dp

2022-06-06 21:51:09 字數 804 閱讀 1374

給一棵 \(m\) 個結點的無根樹,你可以選擇乙個度數大於 \(1\) 的結點作為根,然後給一些結點著以黑色或白色。方案應保證根結點到每個葉子的簡單路徑上都至少包含乙個有色結點。 對於每個葉結點 \(u\) ,定義 \(c[u]\) 為從根結點從 \(u\) 的簡單路徑上最後乙個有色結點的顏色。給出每個 \(c[u]\) 的值,設計著色方案,使得著色結點的個數盡量少。

選擇任意乙個點為根,答案都是相同的

隨便選乙個點為根,然後設 \(f[i][0/1]\) 表示將 \(i\) 染色為 \(0/1\),且子樹內都完成了染色的最小代價

對於乙個葉子結點,若顏色為 \(0\),則令 \(f[p][0]=1,f[p][1]=\infty\),反之亦然

對於乙個非葉子結點,令 \(f[p][0]=f[p][1]=1\)

轉移方程

\[f[p][0] = \sum_ \min(f[q][0]-1,f[q][1]) \\

f[p][1] = \sum_ \min(f[q][1]-1,f[q][0])

\]

#include using namespace std;

const int n = 10005;

vector g[n];

int n,m,c[n],t1,t2,d[n],vis[n],f[n][2];

void dfs(int p)

}}signed main()

for(int i=1;i<=m;i++)

for(int i=m+1;i<=n;i++)

dfs(m+1);

cout<}

CQOI2009 葉子的染色

首先,選擇任意乙個度數大於 1 的節點為根的最優的答案都是固定的,具體證明這裡不加贅述。我們仔細研究,他只要求根節點到葉子節點的最後乙個有色節點的顏色。我們對第 x 號節點染色,意味著我們把所有它子樹中的葉子節點最近的乙個有色節點的顏色就發生了改變。顯然,兒子越多的節點價效比越高。因此,我們定義 d...

CQOI2009 葉子的染色 性質 樹形Dp

online judge bzoj1304,luogu p3155 label 無根樹,樹形dp 給定一棵 n 個節點的無根樹,它一共有 k 個葉子節點。你可以選擇乙個度數大於1的節點作為根,並對整棵樹進行染色 對於每個節點可以染黑 白,或選擇不染 著色方案需滿足以下約束 1.每個葉子節點到樹根的路...

CQOI2009 葉子的染色 貪心或動規

給一棵m個結點的無根樹,你可以選擇乙個度數大於1的結點作為根,然後給一些結點 根 內部結點和葉子均可 著以黑色或白色。你的著色方案應該保證根結點到每個葉子的簡單路徑上都至少包含乙個有色結點 哪怕是這個葉子本身 對於每個葉結點u,定義c u 為從根結點到u的簡單路徑上最後乙個有色結點的顏色。給出每個c...