解析

本题的关键是选取哪一个根对答案没有影响
还有一个重要的性质是:根节点必定涂色
这点对每棵子树作为独立的子问题时依然成立
然鹅我完全没有看到上面那俩性质
直接暴力设计dp状态0.、1、2 开始莽
然后?然后就T了啊…
只好开始考虑换根
然后?然后就WA了啊…
最后捯饬到第四交才过
qwq

有一点可贵是忍住了没看LOJ的数据吧

看到题不要被它的描述迷惑
先想想有啥性质
先好好想清楚性质再敲,不要硬用min交给代码莽!
(尽管最后莽出来了)

代码

其实不用换根但是换都换了不贴太可惜了

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+100;
const double eps=1e-6;
inline ll read() {ll x=0,f=1;char c=getchar();while(!isdigit(c)) {if(c=='-')f=-1;c=getchar();}while(isdigit(c)) {x=(x<<1)+(x<<3)+c-'0';c=getchar();}return f*x;
}
int n,m,k;
struct node{int to,nxt;
}p[N<<1];
int fi[N],cnt=-1;
inline void addline(int x,int y){p[++cnt]=(node){y,fi[x]};fi[x]=cnt;
}
int dp[N][3],c[N],up[N][3];
void dfs1(int x,int f){if(x<=m){dp[x][c[x]]=0;dp[x][3-c[x]]=2e4;dp[x][0]=1;return;}dp[x][0]=dp[x][1]=dp[x][2]=0;for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(to==f) continue;dfs1(to,x);dp[x][0]+=dp[to][0];dp[x][1]+=min(dp[to][0],dp[to][1]);dp[x][2]+=min(dp[to][0],dp[to][2]);}dp[x][0]=min(dp[x][0],min(dp[x][1],dp[x][2])+1);return;
}
void dfs2(int x,int f){if(f){up[x][0]=up[f][0]+dp[f][0]-min(dp[x][1],dp[x][2])-1;up[x][1]=min(up[f][0],up[f][1])+dp[f][1]-min(dp[x][0],dp[x][1]);up[x][2]=min(up[f][0],up[f][2])+dp[f][2]-min(dp[x][0],dp[x][2]);}for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(to==f) continue;dfs2(to,x);}return;
}
int ans=2e9;
int main(){memset(fi,-1,sizeof(fi));cnt=-1;n=read();m=read();for(int i=1;i<=m;i++) c[i]=read(),c[i]++;for(int i=1;i<n;i++){int x=read(),y=read();addline(x,y);addline(y,x);}dfs1(m+1,0);dfs2(m+1,0);for(int i=m+1;i<=n;i++){//printf("i=%d dp=%d up=%d\n",i,dp[i][0],up[i][0]);ans=min(ans,dp[i][0]+up[i][0]);}printf("%d\n",ans);
}
/*
8 6
1 1 0 1 1 0
1 7
2 7
3 7
7 8
4 8
5 8
6 8
*/

洛谷P3155:叶子的染色(树形dp)相关推荐

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

    题目描述 给一棵m个结点的无根树,你可以选择一个度数大于1的结点作为根,然后给一些结点(根.内部结点和叶子均可)着以黑色或白色.你的着色方案应该保证根结点到每个叶子的简单路径上都至少包含一个有色结点( ...

  2. 洛谷P1351 联合权值(树形dp)

    题意 题目链接 Sol 一道很简单的树形dp,然而被我写的这么长 分别记录下距离为\(1/2\)的点数,权值和,最大值.以及相邻儿子之间的贡献. 树形dp一波.. #include<bits/s ...

  3. 洛谷2015 二叉苹果树 树形DP

    https://www.luogu.org/problemnew/show/P2015 二叉苹果树 时间限制: 1 Sec  内存限制: 128 MB 题目描述 有一棵苹果树,如果树枝有分叉,一定是分 ...

  4. 洛谷 2016 战略游戏(树形DP)

    题目描述 Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题. 他要建立一个古城堡,城堡中的路形成一棵树.他要在这棵树的结点上放置最少数目的士兵,使得这些士兵能 ...

  5. 洛谷P1122 最大子树和 树形DP初步

    小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题.一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题.于是当日课后,小明就向老师提 ...

  6. 洛谷P2016 战略游戏【树形dp】

    P2016 战略游戏 时间限制 1.00s 内存限制 125.00MB 题目描述 Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题. 他要建立一个古城堡,城堡 ...

  7. 洛谷 1351 联合权值——树形dp

    题目:https://www.luogu.org/problemnew/show/P1351 对拍了一下,才发现自己漏掉了那种拐弯的情况. #include<iostream> #incl ...

  8. 洛谷 1131 [ZJOI2007]时态同步——树形dp

    题目:https://www.luogu.org/problemnew/show/P1131 因为越高,调节一个影响到的越多,所以底下只要把子树间的差异消除了就行了,与其他部分的差异由更高的边调节. ...

  9. 洛谷P3047 附近的牛 树形dp

    给出一个 n ≤ 1 e 5 n\leq1e5 n≤1e5的树,每个点都有一个点权,求所有的点距离 k k k以内的所有的点的点权和. 不错的题.先简单想:如果是要求这个点向下所有距离 k k k以内 ...

  10. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

最新文章

  1. Python抓取新浪新闻数据(三)
  2. [BZOJ 1221][HNOI2001]软件开发(费用流)
  3. MVC4做网站六后台管理:6.2网站信息设置
  4. 在ASP.NET中使用Microsoft Word文档
  5. Web集成工具Thinfinity® VirtualUI™ v2.0发布丨附下载
  6. 【Android面试】Android面试题集锦 (陆续更新)
  7. html点击按钮计算两个输入框的和_小程序计算报价功能介绍
  8. ASP.NET实现多域名多网站共享Session值
  9. 飞桨模型保存_史上最全解读 | 飞桨模型库重大升级 主流算法模型全覆盖
  10. ×××技术漫谈之IPSec(附MPLS)
  11. 计算机网络网络层之IPv6简介
  12. 多个相机间的对齐之为什么需要对齐,对齐有什么好处?
  13. C#调用电脑的默认图片浏览器软件打开图片
  14. 禅道linux客户端服务端,禅道11.0版本发布,主要集成禅道客户端
  15. [硬件]_ELVE_STLINK下载出现nternal command error问题
  16. 腾讯面试题, 2020年,让我们愉快的赛一次马!
  17. iis 支持apk json ipa下载
  18. 【翠花学Vue】每日打卡——vue打卡1
  19. FOJ 1968 Twinkling lights III
  20. 低功耗蓝牙迈向工业车规级,助力充电桩和电动车智能化

热门文章

  1. 2017年终奖发放,程序员人均11776元排名第一!
  2. mysql 非空语法_mysql从入门到优化(1)基本操作上
  3. 打开本地文件_可以跨软件搜索文件?结构式检索你一定要学会!
  4. 创建失败_号称人人都可编辑的百科词条,创建之路为何屡屡失败?
  5. mysql 5.7.6 5.7.19_MySQL数据库之Mysql 5.7.19 免安装版遇到的坑(收藏)
  6. php 4位数字不足补零,php实现数字不足补0的方法
  7. [SpringSecurity]框架概述
  8. [JavaWeb-MySQL]多表关系介绍
  9. [C++11]独占的智能指针unique_ptr的删除器
  10. C++set容器去重法