就是细节多一些,思路都非常常规.

Code:

#include <bits/stdc++.h>
#define N 1005
#define inf 1061109567
#define ll long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int n,edges;
int hd[N],to[N<<1],nex[N<<1],f[N][7];
void add(int u,int v)
{
nex[++edges]=hd[u],hd[u]=edges,to[edges]=v;
}
void dfs(int x,int ff)
{
f[x][2]=1;
f[x][3]=f[x][4]=0;
int sum=0,sum2=0,aa=0,bb=0;
for(int i=hd[x];i;i=nex[i])
{
int v=to[i];
if(v==ff) continue;
dfs(v,x);
f[x][2]+=min(min(min(f[v][0],f[v][1]), min(f[v][2], f[v][3])), f[v][4]);
sum+=min(f[v][0], f[v][1]);
sum2+=min(min(f[v][0], f[v][1]), min(f[v][2], f[v][3]));
aa+=f[v][0];
bb+=f[v][3];
}
if(abs(aa)<=n) f[x][3]=aa;
else f[x][3]=inf;
if(abs(bb)<=n) f[x][4]=bb;
else f[x][4]=inf;
for(int i=hd[x];i;i=nex[i])
{
int v=to[i];
if(v==ff) continue;
if(abs(sum)<=n) f[x][0]=min(f[x][0], sum+f[v][1]-min(f[v][1],f[v][0]));
if(abs(sum2)<=n) f[x][1]=min(f[x][1], sum2+f[v][2]-min(min(f[v][0], f[v][1]), min(f[v][2], f[v][3])));
}
f[x][3]=min(min(min(f[x][0], f[x][1]), f[x][2]), f[x][3]);
f[x][4]=min(f[x][3], f[x][4]);
}
int main()
{
int i,j,k;
// setIO("input");
scanf("%d",&n);
for(i=2;i<=n;++i)
{
int x;
scanf("%d",&x),add(i,x),add(x,i);
}
memset(f,0x3f,sizeof(f));
dfs(1,0);
printf("%d\n",min(min(f[1][0], f[1][1]), f[1][2]));
return 0;
}

  

luogu 2279 [HNOI2003]消防局的设立 树形dp的更多相关文章

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

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

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

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

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

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

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

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

  5. Luogu 2279 [HNOI2003]消防局的设立 - 贪心

    Description 给定一棵树形图, 建若干个消防站, 消防站能够覆盖到距离不超过2的点, 求最少需要建几个消防站才能覆盖所有点 Solution 从深度最深的点开始, 在它的爷爷节点上建, 每建 ...

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

    仍然是点覆盖集问题,但覆盖半径变成了\(2\) 延续上一题的思路,只是式子更加复杂了 想体验一下min_element大法于是不想优化了 #include <bits/stdc++.h> ...

  7. [luogu]P2279 [HNOI2003]消防局的设立[贪心]

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

  8. Luogu P2279 [HNOI2003]消防局的设立

    这真的是一道SB题.去你的树形DP 我们看到题目就开始考虑贪心,怎么搞? 一个显然的思路,每次找出一个深度最大且未被覆盖的点,然后建一个消防局? 但这样的话,动用简单的人类思维就可以知道:我TM的还不 ...

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

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

随机推荐

  1. Python补充4——替换与修改

    最近在自学Python ,在学习过程中发现一个问题,就是Python 的替换与修改. 按照中文思维,替换与修改有什么区别吗?如果发生了部分替换不就是修改了吗?如果修改了不就是新对象替换了老对象吗? 实 ...

  2. linux的定时器(timer_create,timer_gettime,timer_delete,SIGEV_SIGNAL)

    ref : http://blog.chinaunix.net/uid-28458801-id-5035347.html   系统中的一个模块需要频繁的获取系统时间,使用linux中内置的函数开销过大 ...

  3. MyBatis 源码篇-资源加载

    本章主要描述 MyBatis 资源加载模块中的 ClassLoaderWrapper 类和 Java 加载配置文件的三种方式. ClassLoaderWrapper 上一章的案例,使用 org.apa ...

  4. 三调数据库标注插件v1.3

    三调数据库标注插件 插件介绍: 本插件基于VS2010+ARCGIS Addin 开发,高效率处理三调数据,可以标注相关属性.检查尖角.检查节点平均密度.检查地类图斑属性一致性,方便数据导入建库软件之 ...

  5. WinPE基础知识之头部

    1.DOS头 // DOS MZ头,大小为64个字节 typedef struct _IMAGE_DOS_HEADER { WORD e_magic; // EXE标志,“MZ”(有用,解析时作为是否 ...

  6. JDBC 插入时间字段的值

    ps.setTimestamp(6, new Timestamp(System.currentTimeMillis()));

  7. 关于iReport5.6.0无法正常启动或者闪退或者JDK8不兼容的解决方案

    参考网址: https://blog.csdn.net/erlian1992/article/details/76359191?locationNum=6&fps=1 说白了 ,即 jaspe ...

  8. 少勇 #import和@class的区别

    #import与@class的区别1.import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑,后面会再告 ...

  9. 《浏览器工作原理与实践》<02>TCP协议:如何保证页面文件能被完整送达浏览器?

    前言: 在衡量 Web 页面性能的时候有一个重要的指标叫“FP(First Paint)”,是指从页面加载到首次开始绘制的时长.这个指标直接影响了用户的跳出率,更快的页面响应意味着更多的 PV.更高的 ...

  10. pandas库的一些操作

    1.pd.value_count():带入数值可以计算出value有多少的类别 #得到类别的降序 tips['day'].value_counts(sort=True,ascending=True) ...