1304: [CQOI2009]叶子的染色 - BZOJ

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
3
0
1
0
1 4
2 5
4 5
3 5
Sample
Output
2
HINT

M<=10000
N<=4996

不知道为什么有这么一个结论,任何一个合法节点做根答案都不变()

然后树dp之

每个节点都有三个状态,这棵子树的叶子全部满足,这棵子树的叶子只剩下0没有满足,这棵子树的叶子只剩下1没有满足

然后yy一下就可以想出来转移方程了

叶子全部满足就是

1.什么都不做,下面都满足了

2.只有0或者只有1没有满足,把这个节点染成0或1

只剩下0没有满足就是子树全部满足或者只剩下0没有满足

只剩下1没有满足就是子树全部满足或者只剩下1没有满足

 1 const
2 maxn=10010;
3 var
4 first,c:array[0..maxn]of longint;
5 next,last:array[0..maxn*2]of longint;
6 f:array[0..maxn,0..2]of longint;
7 flag:array[0..maxn]of boolean;
8 n,m,tot:longint;
9
10 procedure insert(x,y:longint);
11 begin
12 inc(tot);
13 last[tot]:=y;
14 next[tot]:=first[x];
15 first[x]:=tot;
16 end;
17
18 function min(x,y:longint):longint;
19 begin
20 if x<y then exit(x);
21 exit(y);
22 end;
23
24 procedure dfs(x:longint);
25 var
26 i,s0,s1,s2:longint;
27 begin
28 flag[x]:=true;
29 if x<=n then
30 begin
31 f[x,0]:=1;
32 f[x,c[x]+1]:=0;
33 f[x,2-c[x]]:=1;
34 exit;
35 end;
36 i:=first[x];
37 s0:=0;
38 s1:=0;
39 s2:=0;
40 while i<>0 do
41 begin
42 if flag[last[i]]=false then
43 begin
44 dfs(last[i]);
45 inc(s0,f[last[i],0]);
46 inc(s1,min(f[last[i],1],f[last[i],0]));
47 inc(s2,min(f[last[i],2],f[last[i],0]));
48 end;
49 i:=next[i];
50 end;
51 f[x,0]:=min(s0,min(s1+1,s2+1));
52 f[x,1]:=s1;
53 f[x,2]:=s2;
54 end;
55
56 procedure main;
57 var
58 i,x,y:longint;
59 begin
60 read(m,n);
61 for i:=1 to n do
62 read(c[i]);
63 for i:=1 to m-1 do
64 begin
65 read(x,y);
66 insert(x,y);
67 insert(y,x);
68 end;
69 dfs(m);
70 writeln(f[m][0]);
71 end;
72
73 begin
74 main;
75 end.

1304: [CQOI2009]叶子的染色 - BZOJ,码迷,mamicode.com

时间: 2024-10-03 06:52:56

1304: [CQOI2009]叶子的染色 - BZOJ的相关文章

BZOJ 1304: [CQOI2009]叶子的染色

1304: [CQOI2009]叶子的染色 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 566  Solved: 358[Submit][Status][Discuss] Description 给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为根,然后给一些结点(根.内部结点和叶子均可)着以黑色或白色.你的着色方案应该保证根结点到每个叶子的简单路径上都至少包含一个有色结点(哪怕是这个叶子本身). 对于每个叶结点u,定义c[u]为从根结

bzoj千题计划233:bzoj 1304: [CQOI2009]叶子的染色

http://www.lydsy.com/JudgeOnline/problem.php?id=1304 结论1:根节点一定染色 如果根节点没有染色,选择其子节点的一个颜色,那么所有这个颜色的子节点都不用染色.答案不会更差. 结论2:相邻节点不会染同一种颜色 将深度更大的那个有色节点变成无色仍然满足要求 结论3:任意一个非叶子节点做根,对答案都没有影响. 考虑将原根节点的一个自己点换成根,原来到根最近的颜色节点不变 所以,任取一个非叶子节点做根 dp[x][0/1]表示x染黑/白,使其子树内叶子

P3155 [CQOI2009]叶子的染色

P3155 [CQOI2009]叶子的染色 题目描述 给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为根,然后给一些结点(根.内部结点和叶子均可)着以黑色或白色.你的着色方案应该保证根结点到每个叶子的简单路径上都至少包含一个有色结点(哪怕是这个叶子本身). 对于每个叶结点u,定义c[u]为从根结点从U的简单路径上最后一个有色结点的颜色.给出每个c[u]的值,设计着色方案,使得着色结点的个数尽量少. 输入输出格式 输入格式: 第一行包含两个正整数m, n,其中n是叶子的个数,m是结点总数

【bzoj1304】[CQOI2009]叶子的染色 树形dp

题目描述 给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为根,然后给一些结点(根.内部结点和叶子均可)着以黑色或白色.你的着色方案应该保证根结点到每个叶子的简单路径上都至少包含一个有色结点(哪怕是这个叶子本身). 对于每个叶结点u,定义c[u]为从根结点从U的简单路径上最后一个有色结点的颜色.给出每个c[u]的值,设计着色方案,使得着色结点的个数尽量少. 输入 第一行包含两个正整数m, n,其中n是叶子的个数,m是结点总数.结点编号为1,2,…,m,其中编号1,2,… ,n是叶子.以下

bzoj1304: [CQOI2009]叶子的染色

又是一道优美的dp Description 给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为根,然后给一些结点(根.内部结点和叶子均可)着以黑色或白色.你的着色方案应该保证根结点到每个叶子的简单路径上都至少包含一个有色结点(哪怕是这个叶子本身). 对于每个叶结点u,定义c[u]为从根结点从U的简单路径上最后一个有色结点的颜色.给出每个c[u]的值,设计着色方案,使得着色结点的个数尽量少. Input 第一行包含两个正整数m, n,其中n是叶子的个数,m是结点总数.结点编号为1,2,…,

[CQOI2009]叶子的染色

https://www.zybuluo.com/ysner/note/1307594 题面 戳我 解析 一开始脑抽了,状态转移时默认直接在子结点染色... 其实这道题还是很简单的. 设\(dp[0/1/2][u]\)表示子树内的叶子结点还需要颜色\(0/1\),或都不需要颜色. 然后直接转移就对了. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include

luogu 3155 [CQOI2009]叶子的染色

题目描述 给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为根,然后给一些结点(根.内部结点和叶子均可)着以黑色或白色.你的着色方案应该保证根结点到每个叶子的简单路径上都至少包含一个有色结点(哪怕是这个叶子本身). 对于每个叶结点u,定义c[u]为从根结点从U的简单路径上最后一个有色结点的颜色.给出每个c[u]的值,设计着色方案,使得着色结点的个数尽量少. 输入格式 第一行包含两个正整数m, n,其中n是叶子的个数,m是结点总数.结点编号为1,2,...,m,其中编号1,2,... ,n

[CQOI2009] 叶子的染色 - 树形dp

给一棵 \(m\) 个结点的无根树,你可以选择一个度数大于 \(1\) 的结点作为根,然后给一些结点着以黑色或白色.方案应保证根结点到每个叶子的简单路径上都至少包含一个有色结点. 对于每个叶结点 \(u\) ,定义 \(c[u]\) 为从根结点从 \(u\) 的简单路径上最后一个有色结点的颜色.给出每个 \(c[u]\) 的值,设计着色方案,使得着色结点的个数尽量少. Solution 选择任意一个点为根,答案都是相同的 随便选一个点为根,然后设 \(f[i][0/1]\) 表示将 \(i\)

[luogu3155 CQOI2009] 叶子的染色(树形dp)

传送门 Solution 十分简单的树形dpQwQ,转移关系:父亲染了儿子不用染 只需要确定根就是简单树形dp,而其实根可以随便取一个非叶子节点 可以分情况讨论发现答案并不会改变 Code //By Menteur_Hxy #include <cmath> #include <vector> #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream&