CQOI2009 葉子的染色 性質 樹形Dp

2022-06-03 07:00:11 字數 2252 閱讀 8770

online judge:bzoj1304,luogu p3155

label:無根樹,樹形dp

給定一棵\(n\)個節點的無根樹,它一共有\(k\)個葉子節點。你可以選擇乙個度數大於1的節點作為根,並對整棵樹進行染色(對於每個節點可以染黑/白,或選擇不染),著色方案需滿足以下約束:

1.每個葉子節點到樹根的路徑上都至少存在1個有色節點; 2.對於編號為\(i\)的葉子節點,給定乙個\(c[i]\),表示從葉子節點到樹根路徑上第乙個遇到的有色節點的顏色(0:黑,1:白)

\(m<=10000\)

\(n<=5021\)

第一行包含兩個正整數\(n,k\)。

結點編號為\(1,2,…,n\),其中編號\(1,2,… ,k\)是葉子。

以下\(k\)行每行乙個0或1的整數(0表示黑色,1表示白色),依次為c[1],c[2],…,c[n]。

以下\(m-1\)行每行兩個整數a,b(1<=a < b <= m),表示結點a和b 有邊相連。

僅乙個數,即著色結點數的最小值。

input

5 301

01 4

2 54 5

3 5

output

2
唯一的難度在於是棵無根樹

如果是棵有根樹怎麼做。

[1]狀態定義

定義狀態\(f[x][0/1]\)表示節點\(x\)染為黑/白,以其為根的子樹所需的最小染色數。

為什麼第二維不再弄個\(2\)表示不染色時的狀態呢(當然這樣也可以做,但沒必要),在之後的轉移中我們有乙個"刪除兒子顏色"的操作,也就是說先染上色,到時候再根據最優性考慮刪除顏色。

[2]初始化、終態

一開始所有節點,不論選黑選白都至少選了乙個有色節點,賦值為1;但對於葉子節點,將他所不能第乙個遇到的那個顏色賦值為inf,後面轉移時就不會用到這個狀態了。

初始化 : \(f[x][0/1]=1\),\(f[leaf][!c[leaf]]=inf\)

最後答案為\(ans=max(f[root][0],f[root][1])\)。只用考慮根節點染黑染白的情況。為什麼無需考慮根節點不染色的情況呢,因為顯然將樹根染上顏色比將其某個子孫染上同種顏色會更優。

[3]轉移

一遍dfs搞一下整棵樹,對於非葉子節點x,其兒子為son。

如果x,son同色,則讓x保留顏色,son刪除顏色更優(x包含的範圍更廣)。如果不同色則都保留。兩者取較小值傳給x。

\(f[x][0]+=min(f[son][0]-1,f[son][1]);\)

\(f[x][1]+=min(f[son][1]-1,f[son][0]);\)

性質:在本題中,根節點的選取對於答案沒有影響。

證明:類似換根的想法,設一開始的樹根為\(x\),現在要將他的某個兒子\(son\)設為根。

根據上面分析,在\(x\)做根的最優方案中,

1.x與son不會染相同的顏色;

2.x一定會染色。

不妨設那時x染為黑。

a.當son染為白時,換根後兩者分別可能會影響的範圍根本沒有變化,所以顏色都不用改變,答案當然不會變。

b.當son不染色時,原來x可能會影響的範圍是整棵樹,換根後,只需將x的顏色轉給son,x本身不染色即可保證樹根可能影響的範圍不變,這樣只有這兩點的顏色交換了,染色總數依然不變。

所以隨便挑乙個非葉子節點做根就好了。

**如下:

#includeusing namespace std;

const int n=10010;

vectore[n];

int f[n][2],n,k;

void dfs(int x,int fa)

}int main()

for(int i=1,u,v;idfs(n,0);

printf("%d\n",min(f[n][0],f[n][1]));

}

CQOI2009 葉子的染色

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

CQOI2009 葉子的染色 樹形dp

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

CQOI2009 葉子的染色 貪心或動規

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