题目描述

给出一个 $n$ 个节点的树,$1$ 号点为根。现要将其中一些点染成黑色,使得每个叶子节点(不包括根节点)到根节点路径上的黑点数相同。求最多能够染多少个黑点。


题解

贪心

显然有结论:选择的黑点尽量靠近叶子节点。

并且显然每个点到根节点路径上的黑点数是:深度最小的叶子节点到根节点路径上的点数。

那么首先预处理出每个点子树内深度最小的叶子节点的深度,然后进行贪心过程:显然如果一个点染黑,那么它到其子树内深度最小的叶子节点路径上的所有点都要染黑。我们维护每个点到根节点的路径上染了多少黑点,就能根据已经染黑的节点数和它到其字数内深度最小的叶子节点路径上的点数即可判断出当前点是否能够选择。

时间复杂度 $O(n)$

#include <cstdio>
#include <algorithm>
#define N 100010
using namespace std;
int head[N] , to[N << 1] , next[N << 1] , cnt , deep[N] , md[N] , now[N] , ans;
inline void add(int x , int y)
{to[++cnt] = y , next[cnt] = head[x] , head[x] = cnt;
}
void dfs(int x , int fa)
{int i;if(x != 1 && !next[head[x]]) md[x] = deep[x];else md[x] = 1 << 30;for(i = head[x] ; i ; i = next[i])if(to[i] != fa)deep[to[i]] = deep[x] + 1 , dfs(to[i] , x) , md[x] = min(md[x] , md[to[i]]);
}
void solve(int x , int fa)
{int i;now[x] = now[fa];if(now[fa] + md[x] - deep[x] == md[1]) now[x] ++ , ans ++ ;for(i = head[x] ; i ; i = next[i])if(to[i] != fa)solve(to[i] , x);
}
int main()
{int n , i , x , y;scanf("%d" , &n);for(i = 1 ; i < n ; i ++ ) scanf("%d%d" , &x , &y) , add(x , y) , add(y , x);dfs(1 , 0);solve(1 , 0);printf("%d\n" , ans);return 0;
}

转载于:https://www.cnblogs.com/GXZlegend/p/8244237.html

【uoj#139】[UER #4]被删除的黑白树 贪心相关推荐

  1. 【UOJ139】【UER #4】被删除的黑白树

    题意: 很久很久以前,有一棵树加入了 UOJ 群. 这天,在它讨论"一棵树应该怎么旋转"的时候一不小心被删除了,变成了被删除的树. 突然间,它突然发现它失去了颜色,变成了一棵纯白的 ...

  2. CodeM美团点评编程大赛 初赛B轮 A 黑白树 贪心 E 子串 暴力

    A题类似想到给多个区间,求最少多少个区间可以覆盖全部的问题,求法就是从当前这步能够到达的区间里,选一个下一步能到的最大值,对于本题,区别一是树形结构,不是一维的直线了,区别二是点都是连续的,不是离散的 ...

  3. 【UOJ#388】【UNR#3】配对树(线段树,dsu on tree)

    [UOJ#388][UNR#3]配对树(线段树,dsu on tree) 题面 UOJ 题解 考虑一个固定区间怎么计算答案,把这些点搞下来建树,然后\(dp\),不难发现一个点如果子树内能够匹配的话就 ...

  4. 【每日一题】4月8日题目精讲 黑白树

    试题链接 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format:%lld 题目描述 一棵n个点的有根树,1号点为根,相邻的 ...

  5. 【JavaScript】appendChild一个的注意点之会删除原dom树节点

    最近在研究学习vue原理,其中使用createDocumentFragment()方法,是用来创建一个虚拟的节点对象,那问题来了,创建了虚拟dom树,且最后只渲染了虚拟dom树里面的节点,那原dom树 ...

  6. UOJ #455 [UER #8]雪灾与外卖 (贪心、模拟费用流)

    题目链接 http://uoj.ac/contest/47/problem/455 题解 模拟费用流,一个非常神奇的东西. 本题即为WC2019 laofu的讲课中的Problem 8,经典的老鼠进洞 ...

  7. [UOJ#245][UER#7B]天路

    Description 给出n个数,对于每个k(2<=k<=n),求出最大的一个ans,使得存在一个连续的长度为k的区间中最大值和最小值的差为ans. 答案与标准答案的误差不超过5%即为正 ...

  8. [UOJ#454][UER#8]打雪仗

    xx 转载于:https://www.cnblogs.com/lxzl/p/10324980.html

  9. 【UOJ】UER#3.B 开学前的日历

    将条件转化为i,j⩾0,i+j⩾k|Av+i,u+j+=(i+ji)i,j⩾0,i+j⩾k|Av+i,u+j+=(i+ji)i,j\geqslant 0,i+j\geqslant k|A_{v+i,u ...

最新文章

  1. Python接口自动化测试框架(基础篇)-- 常用数据类型Number
  2. 在一台Mac上不同平台同时使用多个Git账号
  3. Marketing Cloud和Cloud for Customer的客户主数据
  4. facelets_不要在facelets中重复表情
  5. 【chromium】 Chromium OS的oom机制
  6. 青岛外卖小哥帮崩溃程序员写代码,网友看完破防了:佩服又感动。
  7. 快来一起玩转LiteOS组件:RHas
  8. MTK 驱动开发(31)---Sensor 移植及调试1
  9. 中兴通讯与北京交通大学、中国移动北京公司签署 “5G战略合作框架协议”
  10. java获得数据后如何插入数据表_java如何实现对数据库的插入
  11. 谷歌地球离线地图包_水经注全国离线地图都有哪些地图数据?
  12. Aspose.PSD for Java 21.6 Crack
  13. 《尚书》全文、注释及译文(1)
  14. 40163 php,【PHP】微信支付JsApi 40163错误,_PHP_ 少侠科技
  15. JVM 垃圾收集算法及垃圾收集器
  16. jointJS系列之一:jointJS的的初步使用
  17. 算法设计与分析基础 第一章谜题
  18. 转载:整车CAN网络介绍---CAN--PT CAN--Chassis CAN--Body CAN--Info CAN
  19. 混合App WebView自动化测试
  20. python:cv2.putText用法

热门文章

  1. dhrystone测试结果_RTThread软件包可以对MCU进行性能测试,跑一个试试!
  2. keepalived(8)——http、tcp检测
  3. /MD, /MDD, /ML, /MT,/MTD(使用运行时库)
  4. 十大滤波算法程序大全
  5. Linux嵌入式 -- Bootloader , Uboot
  6. compat mysql51 5.1_MySQL mysql-5.1升级到mysql-5.6
  7. Python报错TypeError: ‘User‘ object is not iterable
  8. c++ 标准库中 cin.ignore()
  9. c++类的静态成员特性
  10. jsch 移动服务器上文件,jsch上传文件到服务器