一看到这道题就知道是树形dp

之前做过类似的题,只不过保护的范围是1

所以简单很多。

这道题保护的范围是2,就复杂了很多。

我就开始列状态,然后发现竟然有5种

然后我就开始列方程。

但是我考虑的时候是用一条链去思考的。

显然应该要用深度为3的完全二叉树去思考。

所以我写到一半发现自己的方程有问题。

然后就干脆放弃了,因为思维量好大。

然后去看题解。发现我完成了正解的三分之一。

后面的方程写出之后还需要很牛逼的简化。

我花了很长时间才理解。

自己还是太菜了。
http://www.cnblogs.com/QWsin/p/5306197.html

这道题还有贪心的做法

每次找到最深没有被覆盖的点,然后到爷爷建一个消防站

代码很简单。

#include<cstdio>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std; const int MAXN = 1123;
int g[MAXN][MAXN], fa[MAXN];
int d[MAXN], vis[MAXN], n, x; void dfs(int u, int d) //这种dfs写法很棒
{ //表示把距离u为d的节点全部遍历一遍。
vis[u] = 1;
if(d == 0) return;
_for(i, 1, n)
if(g[u][i])
dfs(i, d - 1);
dfs(fa[u], d - 1);
} int main()
{
scanf("%d", &n);
_for(i, 2, n)
{
scanf("%d", &x);
g[x][i] = 1;
fa[i] = x;
} fa[1] = 1;
_for(i, 1, n)
d[i] = d[fa[i]] + 1; int ans = 0;
while(1)
{
int p = 0;
_for(i, 1, n)
if(!vis[i] && d[i] > d[p])
p = i;
if(p == 0) break;
dfs(fa[fa[p]], 2);
ans++;
}
printf("%d\n", ans); return 0;
}

洛谷上还有比较快的做法

普适性比较强,可以解决半径为k的最小覆盖问题。

#include<cstdio>
#include<algorithm>
#define REP(i, a, b) for(int i = (a); i < (b); i++)
#define _for(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std; const int MAXN = 1123;
int d[MAXN], fa[MAXN], p[MAXN], k[MAXN], n; bool cmp(int a, int b) { return d[a] > d[b]; } int main()
{
scanf("%d", &n);
p[1] = 1; k[1] = k[0] = n;
_for(i, 2, n)
{
scanf("%d", &fa[i]);
d[i] = d[fa[i]] + 1;
k[i] = n;
p[i] = i;
}
sort(p + 1, p + n + 1, cmp); int ans = 0;
_for(i, 1, n)
{
int u = p[i], f = fa[u], g = fa[fa[u]];
k[u] = min(k[u], min(k[f] + 1, k[g] + 2));
if(k[u] > 2)
{
k[g] = 0; ans++;
k[fa[g]] = min(k[fa[g]], 1);
k[fa[fa[g]]] = min(k[fa[fa[g]]], 2);
}
}
printf("%d\n", ans); return 0;
}

洛谷 P2279 [HNOI2003]消防局的设立 (树形dp or 贪心)的更多相关文章

  1. 洛谷 P2279 [HNOI2003]消防局的设立 题解

    每日一题 day34 打卡 Analysis 这道题的正解本来是树形dp,但要设5个状态,太麻烦了.于是我就用贪心试图做出此题,没想到还真做出来了. 考虑当前深度最大的叶子结点,你肯定要有一个消防局去 ...

  2. P2279 [HNOI2003]消防局的设立[树形dp]

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

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

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

  4. 洛谷 P2279 [HNOI2003]消防局的设立

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

  5. BZOJ1217或洛谷2279 [HNOI2003]消防局的设立

    BZOJ原题链接 洛谷原题链接 该题有两种做法,树形\(DP\)和贪心. 先讲贪心. 先将所有点按深度从大到小排序,然后从大到小依次取出点,若已经被覆盖则跳过,否则就在它的祖父点建立消防站. 考虑如何 ...

  6. 【BZOJ1217】[HNOI2003]消防局的设立 树形DP

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

  7. 洛谷 2279 [HNOI2003]消防局的设立

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

  8. [HNOI2003]消防局的设立 树形dp // 贪心

    https://www.luogu.org/problemnew/show/P2279 一开始就想到了贪心的方法,不过一直觉得不能证明. 贪心的考虑是在深度从深到浅遍历每个结点的过程中,对于每个没有覆 ...

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

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

随机推荐

  1. P3376 【模板】网络最大流(luogu)

    P3376 [模板]网络最大流(luogu) 最大流的dinic算法模板(采取了多种优化) 优化 时间 inline+当前弧+炸点+多路增广 174ms no 当前弧 175ms no 炸点 249 ...

  2. [CTSC1999][网络流24题]家园

    题目:洛谷P2754. 题目大意:有$n$个空间站,$m$个飞船,每个飞船有各自的停靠站点,并且从第一个停靠站点开始,不断循环.每个飞船有不同的容量(-1为月球,0为地球).每个飞船初始停在第一个停靠 ...

  3. Jquery JS 全局变量

    window["a1"]="abc";window["b1"]=5;

  4. webstorm注册码注册

    最近jetbrains公司更新软件总是特别的快,很多私人搭建的server服务也失效了,现出一个能够永久破解的方法,非常简单,只需要2步就完成. 第一步 复制下方activation code,直接粘 ...

  5. 20130907.Git学习记录

    1.任何文件在Git内都只有三种状态: ①已提交(committed):已提交表示该文件已经被安全地保存在本地数据库中了: ②已修改(modified):已修改表示修改了某个文件,但还没有提交保存: ...

  6. STM32 HAL库 IIC 协议库函数

    /* 第1个参数为I2C操作句柄 第2个参数为从机设备地址 第3个参数为从机寄存器地址 第4个参数为从机寄存器地址长度 第5个参数为发送的数据的起始地址 第6个参数为传输数据的大小 第7个参数为操作超 ...

  7. Spring 7大功能模块的作用

    1.   Spring 7大功能模块的作用 1)   核心容器(Spring core) 核心容器提供Spring框架的基本功能.Spring以bean的方式组织和管理Java应用中的各个组件及其关系 ...

  8. 洛谷 P1529 回家 Bessie Come Home

    P1529 回家 Bessie Come Home 题目描述 现在是晚餐时间,而母牛们在外面分散的牧场中. 农民约翰按响了电铃,所以她们开始向谷仓走去. 你的工作是要指出哪只母牛会最先到达谷仓(在给出 ...

  9. 极路由设置共享磁盘密码、跨网访问samba服务

    极路由插上移动硬盘后会自动建立samba服务器,但我们没法去配置哪些盘符需要密码,这样只要在同一个wifi下的电脑都能去访问这些东西了,比较弱智.另外我还想再公司中去读写这个移动硬盘. 设置密码 首先 ...

  10. objective-c訪问控制符

    objective-c中成员变量的四个訪问控制符: @private:仅仅有当前类的内部才干訪问 @public:全部人都可訪问 @protected:仅仅限当前类和它的子类可以訪问 @package ...