洛谷P2279消防局的设立】的更多相关文章

正解:贪心 解题报告: 传送门! 这题贪心得挺显然的,,,?居然能有蓝,,,是蓝题太水了嘛,,,? 简单说下,这题一看到就能想到,对最低的没被覆盖到的点给它的祖父建一个消防局 没了? 哦这题实现还挺有趣的感觉 最简单的实现就是用个dfs或堆什么的走一波 然后比较高级的一个是边读边贪心?一个是不用贪心强行dp?到时候具体写下实现趴QAQ over 边读边贪心就很简单啊,,,因为读一下题目可以知道它读入的是fa[i],所以可以在读入的时候直接处理出deep顺便排个序,然后就直接做了,就可以不要用堆…
题目:https://www.luogu.org/problemnew/show/P2279 题意:一棵树.在节点处建消防站,可以覆盖与他距离在2之内的节点.问最少要建多少个消防站,可以覆盖所有的节点. 思路:有一种贪心的思路,看大部分题解都是这样. 如果要覆盖当前节点(自己不建),那么可能是父亲,兄弟,祖父建了. 但是我们发现,在祖父建覆盖的范围比父亲兄弟要更广一些.所以就贪心的取深度最深的节点,在他的祖父处建一个. 因为想练dp所以没写贪心的. 看结构感觉是树形dp.$dp[i]$表示以$i…
传送门啦 一个很摸不清头脑的树形dp 状态: $ dp[i][0] $ :选自己 $ dp[i][1] $ :选了至少一个儿子 $ dp[i][2] $ :选了至少一个孙子 -----------------------------------覆盖了自己的 $ dp[i][3] $ : 儿子孙子全部覆盖 $ dp[i][4] $ :孙子全部覆盖 -----------------------------------并没有覆盖自己 初始转移方程: $ dp[i][0] = 1+\sum min(d…
2016-05-30 16:18:17 题目链接: 洛谷 P2279 03湖南 消防局的设立 题目大意: 给定一棵树,选定一个节点的集合,使得所有点都与集合中的点的距离在2以内 解法1: 贪心 首先DFS转化为有根树,每次取最深节点的爷爷进入集合 //消防局的设立 03湖南 //贪心 #include<stdio.h> #include<algorithm> using namespace std; ; struct node { int deep; int id; }; node…
消防局的设立 题目链接 贪心:每次取出深度最大的节点,若没有被覆盖到,要想覆盖它, 最优的做法显然是将它的爷爷设为消防局 (因为该节点深度为最大,选兄弟.父亲所覆盖的节点,选了爷爷后都能够覆盖) 用优先队列维护深度即可 #include<iostream> #include<cstring> #include<cstdio> #include<queue> using namespace std; #define INF 100000 #define N 1…
一看到这道题就知道是树形dp 之前做过类似的题,只不过保护的范围是1 所以简单很多. 这道题保护的范围是2,就复杂了很多. 我就开始列状态,然后发现竟然有5种 然后我就开始列方程. 但是我考虑的时候是用一条链去思考的. 显然应该要用深度为3的完全二叉树去思考. 所以我写到一半发现自己的方程有问题. 然后就干脆放弃了,因为思维量好大. 然后去看题解.发现我完成了正解的三分之一. 后面的方程写出之后还需要很牛逼的简化. 我花了很长时间才理解. 自己还是太菜了.http://www.cnblogs.c…
[题解][P2279 HNOI2003]消防局的设立 又是一道贪心. 随便指定一个点为根,可以知道在覆盖了一个节点的子树的情况下,消防站越高越好.那么我们就贪心吧.\(trick\)是按深度\(push\)到\(queue\)里,然后直接取出来判断.贪心. 咕咕咕 #include<iostream> #include<cstring> #include<queue> #include<cstdlib> #include<vector> #inc…
题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状结构.如果基地A到基地B至少要经过d条道路的话,我们称基地A到基地B的距离为d. 由于火星上非常干燥,经常引发火灾,人类决定在火星上修建若干个消防局.消防局只能修建在基地里,每个消防局有能力扑灭与它距离不超过2的基地的火灾. 你的任务是计算至少要修建多少个消防局才能够确保火星上所有的基地在发生火灾时…
题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状结构.如果基地A到基地B至少要经过d条道路的话,我们称基地A到基地B的距离为d. 由于火星上非常干燥,经常引发火灾,人类决定在火星上修建若干个消防局.消防局只能修建在基地里,每个消防局有能力扑灭与它距离不超过2的基地的火灾. 你的任务是计算至少要修建多少个消防局才能够确保火星上所有的基地在发生火灾时…
每日一题 day34 打卡 Analysis 这道题的正解本来是树形dp,但要设5个状态,太麻烦了.于是我就用贪心试图做出此题,没想到还真做出来了. 考虑当前深度最大的叶子结点,你肯定要有一个消防局去覆盖它, 那么既然他是叶子结点,所以与他距离小于等于2的节点有这么 他的父亲 2. 他的兄弟 3. 他的爷爷 容易看出,在前两项能够覆盖到的节点,在爷爷那里设立一定也能覆盖到. 所以每次贪心取出深度最大的节点,在他的爷爷哪里放一个消防站 用STL的priority_queue,时间复杂度O(nlog…