原博主部落格
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
sample output5 301
01 4
2 54 5
3 5
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的簡單路徑上最後乙個有色結點的顏色。...