1304 CQOI2009 葉子的染色

2021-09-25 17:52:56 字數 1563 閱讀 6844

原博主部落格

time limit: 10 sec memory limit: 162 mb

description

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

input

第一行包含兩個正整數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 有邊相連。

output

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

sample input

5 301

01 4

2 54 5

3 5

sample output
2
hint
m<=10000

n<=5021

解析

code

#include

using

namespace std;

const

int n=

1e4+5;

const

int inf=

0x7f7f7f7f

;int

read()

while

(isdigit

(ch)

)return f*s;

}struct fjye[n<<1]

;int fir[n]

,cnt;

void

add(

int u,

int v)

int f[n][2

],w[n]

;//f[i][k]表示以i為根的子樹中,將i染成k色的子樹中最少染色個數

int n,m,u,v;

intmin

(int x,

int y)

void

dfs(

int u,

int fa)

else

f[u]

[!w[e[i]

.v]]++;

//,printf("v=%d",e[i].v);}}

intmain()

for(

int i=

1;i<=n;i++

) f[i]

[w[i]]=

1,f[i]

[!w[i]

]=inf;

dfs(n+1,

0);printf

("%d"

,min

(f[n+1]

[1],f[n+1]

[0])

);return0;

}

CQOI2009 葉子的染色

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

JZOJ B組 CQOI2009 葉子的顏色

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

P3155 CQOI2009 葉子的染色

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