JZOJ B組 CQOI2009 葉子的顏色

2021-08-21 06:53:37 字數 1182 閱讀 5620

給一棵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 3

0 1

0 1 4

2 5

4 5

3 5【資料範圍】  

1<=n,m<=100000

通過感性推理,多次試驗證明選哪個點作為根節點都是一樣的!!!

我們考慮樹形dp

f[i][0..1]為第i個節點的子樹,i0..1顏色的最小染色次數。

由於我們設定i一定要染色,所以初始值是1。

假設i染黑色,如果它的子節點也染黑色,可以發現是不用染的,所以染色點數減一

#include

#include

#include

#include

using

namespace

std;

const

int maxn=100077;

vector

a[maxn];

int n,m,b[maxn],ass=0,ans=0,f[maxn][2],c[maxn];

void dfs(int u,int fa)

}int main()

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

// memset(d,0,sizeof(d));

dfs(n+1,0);

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

}

CQOI2009 葉子的染色

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

CQOI2009 葉子的染色 樹形dp

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

題解 CQOI2009 中位數

目錄分析 注意事項 code 執行限制 時間不超過 1.00 textrm 空間不超過 128 textrm 給出 1,2,cdots,n 的乙個排列,統計該排列有多少個長度為奇數的連續子串行的中位數是 b 中位數是指把所有元素從小到大排列後,位於中間的數。第一行為兩個正整數 n 和 b 第二行為 ...