【BZOJ1217】[HNOI2003]消防局的设立 树形DP
【BZOJ1217】[HNOI2003]消防局的设立
Description
Input
Output
仅有一个正整数,表示至少要设立多少个消防局才有能力及时扑灭任何基地发生的火灾。
Sample Input
1
2
3
4
5
Sample Output
题解:侦查守卫的弱化版。用f[i][j]表示i的子树中所有点已被覆盖,且还能向上覆盖j层的最小花费,g[i][j]表示i的j层下面的所有点已被覆盖,还需要覆盖上面的j层的最小花费。转移比较容易。
#include <cstring>
#include <cstdio>
#include <iostream> using namespace std;
int n,cnt;
const int maxn=100010;
int f[maxn][3],g[maxn][2],to[maxn],next[maxn],head[maxn];
void dfs(int x)
{
f[x][0]=f[x][1]=f[x][2]=1,g[x][0]=g[x][1]=0;
for(int y,i=head[x];i!=-1;i=next[i])
{
y=to[i],dfs(y);
f[x][0]=min(f[x][0]+f[y][0],g[x][0]+f[y][1]);
f[x][1]=min(f[x][1]+g[y][0],g[x][1]+f[y][2]);
f[x][2]=f[x][2]+g[y][1];
g[x][0]+=f[y][0];
g[x][1]+=g[y][0];
f[x][1]=min(f[x][1],f[x][2]),f[x][0]=min(f[x][0],f[x][1]);
g[x][0]=min(g[x][0],f[x][0]),g[x][1]=min(g[x][1],g[x][0]);
}
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
}
inline void add(int a,int b)
{
to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
}
int main()
{
n=rd();
int i,a;
memset(head,-1,sizeof(head));
for(i=2;i<=n;i++) a=rd(),add(a,i);
dfs(1);
printf("%d",f[1][0]);
return 0;
}
【BZOJ1217】[HNOI2003]消防局的设立 树形DP的更多相关文章
- bzoj1217: [HNOI2003]消防局的设立 [树形dp]
Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了 ...
- P2279 [HNOI2003]消防局的设立[树形dp]
题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状 ...
- [HNOI2003]消防局的设立 树形dp // 贪心
https://www.luogu.org/problemnew/show/P2279 一开始就想到了贪心的方法,不过一直觉得不能证明. 贪心的考虑是在深度从深到浅遍历每个结点的过程中,对于每个没有覆 ...
- luogu 2279 [HNOI2003]消防局的设立 树形dp
就是细节多一些,思路都非常常规. Code: #include <bits/stdc++.h> #define N 1005 #define inf 1061109567 #define ...
- [HNOI2003] 消防局的设立 - 树形dp
仍然是点覆盖集问题,但覆盖半径变成了\(2\) 延续上一题的思路,只是式子更加复杂了 想体验一下min_element大法于是不想优化了 #include <bits/stdc++.h> ...
- BZOJ1217: [HNOI2003]消防局的设立
BZOJ1217: [HNOI2003]消防局的设立 Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地. 起初为了节约材料,人类只修建了n-1条道路来连接这些基地 ...
- [HNOI2003]消防局的设立 (贪心)
[HNOI2003]消防局的设立 题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达, ...
- BZOJ 1217: [HNOI2003]消防局的设立( 贪心 )
一个简单的贪心, 我们只要考虑2个消防局设立的距离为5时是最好的, 因为利用最充分. 就dfs一遍, 再对根处理一下就可以了. 这道题应该是SGU某道题的简化版...这道题距离只有2, 树型dp应该也 ...
- P2279 [HNOI2003]消防局的设立
P2279 [HNOI2003]消防局的设立考场上想出了贪心策略,但是处理细节时有点问题,gg了.从(当前深度最大的节点)叶子节点往上跳k个,在这里设消防局,并从消防局遍历k个距离,标记上. #inc ...
随机推荐
- unity, editorWindow update计时
对于editorWindow,Time.deltaTime不起作用,所以需用下面方法对update进行计时: public class myEditorWindow : EditorWindow{ p ...
- KVM部署LVS集群故障案例一则
一.故障现象 KVM部署LVS(Linux Virtual Server)集群后,能够单独以HTTP方式访问RS(Real Server)的实际IP,但无法通过VIP(Virtual IP)访问. 二 ...
- sim900GPRS模块ppp拨号上网
--------------------------------------------- 主机操作系统:Centos 6.5 交叉编译器环境:arm-linux-gcc-4.5.4 开发板平台: F ...
- mysql root 用户被删
[root@M ~]# vi /etc/my.cnf [mysqld] skip-grant-tables [root@M ~]# service mysqld restart Shutting do ...
- removeFromParentAndCleanup和callfuncN_selector
void removeFromParentAndCleanup (bool cleanup)//删除父节点中的当前节点并清除动作及回调函数 void ActionCallFuncND::onEnte ...
- java读properties文件 乱码
java读properties文件,包含中文字符的主要有两种: 1.key中包含中文字符的(value中也有可能包含) 2.key中不包含中文字符的(value中有可能包含) 1.key中包含中文字符 ...
- CodeForces 35D Animals
G - Animals Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit ...
- 常用jar命令
JAR包是Java中所特有一种压缩文档.存储格式格式就是.zip包.但是与ZIP包不同的地方是,生成JAR包时候,会自动添加一个META-INF\MANIFEST.MF文件 命令参数jar {c t ...
- Js常用插件介绍
*各种JS功能介绍 1.zDialog.js 各种弹窗插件详细案例:http://www.2ky.cn/Pri_upfile/txdemo/0811/zDialog/zDialogDemo.html ...
- 三分 - HNU 13409 Flowers
Flowers Problem's Link: http://acm.hnu.cn/online/?action=problem&type=show&id=13409&cour ...