有乙個\(m\)個節點的樹,可以選擇乙個度大於\(1\)的節點作為根,並將一些點染為白色或黑色,染色方案因保證根到每個葉子節點的路徑上都至少有乙個有色節點,並且路徑上離葉子結點最近的節點顏色為\(c_i\)
我們考慮選哪個節點為根不影響答案的選擇,因為我們只需要維護葉子節點上方最近的有顏色節點,非葉節點是否為根並不影響答案。我們考慮對於節點\(i\),如果要將\(i\)染成白色,顯然它的葉子節點可以繼承它的節點。我們記\(f[i][j]\)表示\(i\)染為\(j\)顏色的代價,而這個顏色是可以繼承的。所以我們有兩種選擇,一是繼承其父親的顏色,二是設立乙個新的顏色。繼承的話這個點就無須設為應該設的顏色,所以轉移方程為\(f[i][0]=\sum min\\)(\(v\)是\(i\)的兒子)。黑色也類似,對於葉子節點將不符的顏色直接設為無窮大即可。
#includeusing namespace std;
const int n=1e4+10,inf=1e8;
int read()
while(ch>='0'&&ch<='9')
return res*w;
}void write(int x)
if(x>9)write(x/10);
putchar(x%10+'0');
}int head[n],to[n<<1],nxt[n<<1],tot;
void add_edge(int x,int y)
int f[n][3],n;
bool c[n];
void dfs(int u,int fa)
f[u][0]=f[u][1]=1;
for(int i=head[u];i;i=nxt[i]) }
int main()
dfs(n+1,0);
write(min(f[n+1][0],f[n+1][1]));
}
葉子的染色(樹型dp)
給一棵m個結點的無根樹,你可以選擇乙個度數大於1的結點作為根,然後給一些結點 根 內部結點和葉子均可 著以黑色或白色。你的著色方案應該保證根結點到每個葉子的簡單路徑上都至少包含乙個有色結點 哪怕是這個葉子本身 對於每個葉結點u,定義c u 為從根結點從u的簡單路徑上最後乙個有色結點的顏色。給出每個c...
bzoj1304 葉子的染色
給一棵m個結點的無根樹,你可以選擇乙個度數大於1的結點作為根,然後給一些結點 根 內部結點和葉子均可 著以黑色或白色。你的著色方案應該保證根結點到每個葉子的簡單路徑上都至少包含乙個有色結點 哪怕是這個葉子本身 對於每個葉結點u,定義c u 為從根結點從u的簡單路徑上最後乙個有色結點的顏色。給出每個c...
CQOI2009 葉子的染色
首先,選擇任意乙個度數大於 1 的節點為根的最優的答案都是固定的,具體證明這裡不加贅述。我們仔細研究,他只要求根節點到葉子節點的最後乙個有色節點的顏色。我們對第 x 號節點染色,意味著我們把所有它子樹中的葉子節點最近的乙個有色節點的顏色就發生了改變。顯然,兒子越多的節點價效比越高。因此,我們定義 d...