[HNOI2003]消防局的设立

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 908  Solved: 531
[Submit][Status][Discuss]

Description

2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地。起初为了节约材料,人类只修建了n-1条道路来
连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状结构。如果基地A到
基地B至少要经过d条道路的话,我们称基地A到基地B的距离为d。由于火星上非常干燥,经常引发火灾,人类决定
在火星上修建若干个消防局。消防局只能修建在基地里,每个消防局有能力扑灭与它距离不超过2的基地的火灾。
你的任务是计算至少要修建多少个消防局才能够确保火星上所有的基地在发生火灾时,消防队有能力及时扑灭火灾

Input

第一行为n,表示火星上基地的数目。N<=1000
接下来的n-1行每行有一个正整数,其中文件第i行的正整数为a[i],表示从编号为i的基地到编号为a[i]的基地之间有一条道路,
为了更加简洁的描述树状结构的基地群,有a[i] < i

Output

仅有一个正整数,表示至少要设立多少个消防局才有能力及时扑灭任何基地发生的火灾。

Sample Input

6
1
2
3
4
5

Sample Output

2

HINT

Source

尽量长度为5吧这样最优
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4
 5 using namespace std;
 6
 7 const int maxn = 1009;
 8
 9 int N, f[maxn], ans;
10
11 struct edge {
12     int to;
13     edge* next;
14 } E[maxn << 1], *pt = E, *head[maxn];
15
16 inline void AddEdge(int u, int v) {
17     pt->to = v;
18     pt->next = head[u];
19     head[u] = pt++;
20 }
21
22 void Init() {
23     scanf("%d", &N);
24     for(int i = 1; i < N; i++) {
25         int v;
26         scanf("%d", &v); v--;
27         AddEdge(i, v);
28         AddEdge(v, i);
29     }
30     ans = 0;
31 }
32
33 void DFS(int x, int p = -1) {
34     int mn = maxn, mx = -maxn;
35     for(edge* e = head[x]; e; e = e->next) if(e->to != p) {
36         DFS(e->to, x);
37         mn = min(f[e->to], mn);
38         mx = max(f[e->to], mx);
39     }
40     if(mn + mx <= 3)
41         f[x] = mn + 1;
42     else
43         f[x] = mx + 1;
44     if(mn == maxn)
45         f[x] = 3;
46     if(f[x] == 5)
47         ans++, f[x] = 0;
48     else if(p < 0 && f[x] > 2)
49         ans++;
50 }
51
52 int main() {
53
54     Init();
55     DFS(0);
56     printf("%d\n", ans);
57
58     return 0;
59 }

转载于:https://www.cnblogs.com/fengzhiyuan/p/8682180.html

bzoj 1217 [HNOI2003]消防局的设立 贪心相关推荐

  1. 【bzoj1217】[HNOI2003]消防局的设立 贪心

    [HNOI2003]消防局的设立  Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能 ...

  2. BZOJ1217: [HNOI2003]消防局的设立

    BZOJ1217: [HNOI2003]消防局的设立 Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地. 起初为了节约材料,人类只修建了n-1条道路来连接这些基地 ...

  3. 【洛谷P2279】[HNOI2003]消防局的设立

    消防局的设立 题目链接 贪心:每次取出深度最大的节点,若没有被覆盖到,要想覆盖它, 最优的做法显然是将它的爷爷设为消防局 (因为该节点深度为最大,选兄弟.父亲所覆盖的节点,选了爷爷后都能够覆盖) 用优 ...

  4. [HNOI2003]消防局的设立(贪心)

    链接:https://ac.nowcoder.com/acm/problem/20031 来源:牛客网 题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类 ...

  5. [Luogu2279][HNOI2003] 消防局的设立

    文章目录 题目 法一:树上DP 思路 代码实现 法二:贪心 + 搜索 思路 代码实现 题目 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来 ...

  6. bzoj1217: [HNOI2003]消防局的设立 [树形dp]

    Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了 ...

  7. [HNOI2003] 消防局的设立

    经典题,但还是想写一篇完整而又详细美观的题解. 本文含有贪心及 dp 的做法,适合所有语言人群阅读. 1Perface\Large\textbf{1 Perface}1 Perface 本题的 424 ...

  8. BZOJ 2151 种树(可反悔贪心,链表)【BZOJ千题计划】就图一乐

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2151 是 hydro 的 BZOJ ...

  9. BZOJ 2135 刷题计划(贪心,求导,二分)【BZOJ 修复工程】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2135 是 hydro 的 BZOJ ...

最新文章

  1. 现代操作系统: 第五章 输入/输出
  2. 艾伟:详解AJAX核心 —— XMLHttpRequest 对象 (下)
  3. 龙芯团队 在移值 MIPS64 下的.NET Core 进度速报
  4. c语言学习-使用指针对三个变量互相赋值
  5. ConcurrentHashMap 底层原理,你真的理解了吗?
  6. 深度学习笔记_搭建一个简单网络(完整版)_手写数字识别MNIST
  7. MFC入门之 Ribbon界面设计
  8. 微信小程序列表页跳转到详情页
  9. 主数据及其管理MDM
  10. R语言对数据进行非参数检验
  11. android自带网页提供,Android调用系统自带浏览器打开网页的实现方法
  12. Javascript特效之向左滚动的广告
  13. 深入解读RFM模型-实战应用干货
  14. 小内存堆管理算法详细解析
  15. 【持续更新中······】 各种模板+神奇黑科技
  16. 最新版 IDEA 2022.1 正式上线 各种新操作...新功能...都在这里啦
  17. 城乡规划编制资质很多地区已经开通新办了,那你知道怎么办吗?
  18. w ndows7怎么设置桌面保护,Windows7屏幕保护功能失效了怎么办?
  19. PlusFo小道消息独家报道,与黑子的争霸谁能更胜一筹
  20. Matlab实例测验

热门文章

  1. discuz 后台页面扩展开发
  2. linux中线程的问题,linux中的线程问题
  3. Linux Tun/Tap网口(/dev/net/tun)的读写方法
  4. JavaWeb——AOP
  5. C#访问和操作MYSQL数据库
  6. 应用随机过程张波商豪_学术简报五相逆变器非正弦双随机空间矢量脉宽调制策略...
  7. arduino eeg脑电模块_应用深度学习EEGNet来处理脑电信号
  8. 团队协助 开源项目_适合小团队的协作工具,良心开源项目管理工具
  9. 通过OKhttp3 访问 https地址
  10. Android集成百度地图