这真的是一道SB题。去你的树形DP

我们看到题目就开始考虑贪心,怎么搞?

一个显然的思路,每次找出一个深度最大且未被覆盖的点,然后建一个消防局?

但这样的话,动用简单的人类思维就可以知道:我TM的还不如放在它爷爷(父节点的父节点)处呢

然后考虑有没有反例。。。。。。30min later

怎么一个反例都没有?那么说明这个贪心是正确的了?

接下来我们来简单证明一下贪心的正确性:

由于这个点是当前深度最大且未被覆盖的点,因此所有深度比它深的点都被覆盖了。

然后没有被覆盖且可以被这个点覆盖的点还有以下几类:

  1. 它自己(or 兄弟)
  2. 它的父亲节点
  3. 它的爷爷节点

然后我们很容易发现,当把消防站设立在它爷爷处不仅可以覆盖到所有1,2,3情况的点,还可以多往上覆盖一些点。

然后我们直接贪即可。由于这里我们可以通过BFS的顺序直接得出这些点的深度(这样就直接排好序了)

最后一个一个弹出判断即可,复杂度\(O(N)\)。

CODE

#include<cstdio>
#include<cstring>
#include<cctype>
using namespace std;
const int N=1005;
struct edge
{
int to,next;
}e[N<<1];
int head[N],cnt,n,x,father[N],q[N],ans;
bool vis[N];
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch; while (!isdigit(ch=tc()));
while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
}
inline void double_add(int x,int y)
{
e[++cnt].to=y; e[cnt].next=head[x]; head[x]=cnt;
e[++cnt].to=x; e[cnt].next=head[y]; head[y]=cnt;
}
inline void BFS(int x)
{
register int i,H=0,T=1; q[1]=x; vis[x]=1;
while (H<T)
{
int now=q[++H];
for (i=head[now];~i;i=e[i].next)
if (!vis[e[i].to]) q[++T]=e[i].to,vis[e[i].to]=1;
}
}
inline void reset(int now,int d)
{
if (d>2) return; vis[now]=1;
for (register int i=head[now];~i;i=e[i].next)
reset(e[i].to,d+1);
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
register int i; read(n);
memset(head,-1,sizeof(head));
for (i=2;i<=n;++i)
read(x),double_add(i,x),father[i]=x; BFS(1);
memset(vis,0,sizeof(vis)); father[1]=1;
while (n)
{
if (!vis[q[n]]) ++ans,reset(father[father[q[n]]],0); --n;
}
return printf("%d",ans),0;
}

Luogu P2279 [HNOI2003]消防局的设立的更多相关文章

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

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

  2. 【luogu P2279 [HNOI2003]消防局的设立】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2279 想怎么贪怎么贪 #include <queue> #include <cstdio& ...

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

    P2279 [HNOI2003]消防局的设立考场上想出了贪心策略,但是处理细节时有点问题,gg了.从(当前深度最大的节点)叶子节点往上跳k个,在这里设消防局,并从消防局遍历k个距离,标记上. #inc ...

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

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

  5. P2279 [HNOI2003]消防局的设立 贪心or树形dp

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

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

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

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

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

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

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

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

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

随机推荐

  1. Android开发常用的一些功能列表(转)

    文章来源:http://www.cnblogs.com/netsql/archive/2013/03/02/2939828.html 1.软件自动更新下载,并提示 2.软件登录注册,以及状态保存 3. ...

  2. [20171113]修改表结构删除列相关问题3.txt

    [20171113]修改表结构删除列相关问题3.txt --//维护表结构删除字段一般都是先ALTER TABLE <table_name> SET UNUSED (<column_ ...

  3. asp.net webapi 自定义身份验证

    /// <summary> /// 验证 /// </summary> /// Account API账号 /// TimeStamp 请求时间 /// Sign 所有请求参数 ...

  4. 【软件工程1916|W(福州大学)_助教博客】团队答辩助教问题记录

    周一进行了团队项目的课堂答辩,结合团队项目报告对团队项目提出了1-2个问题,将问题和团队回答巨鹿如下 那周余嘉熊掌将得队 如何用户保证隐私安全?答:后期考虑,团队中有一个专业是信息安全的,会针对这块提 ...

  5. Python3编写网络爬虫09-数据存储方式二-JSON文件存储

    2.JSON文件存储 全称为JavaScript Object Notation 通过对象和数组的组合来表示数据,构造简洁且结构化程度非常高.是一种轻量级的数据交换格式 2.1 对象和数组 在Java ...

  6. centos7下安装docker(3.2创建镜像build)

    通过Dockerfile创建镜像 注:这个Dockerfile一开始真的不知道是在哪来的,还以为是在官网下载下来得(当然网上也有很多dockerfile的模板,参考:https://hub.docke ...

  7. 2018-2019-2 网络对抗技术 20165318 Exp6 信息搜集与漏洞扫描

    2018-2019-2 网络对抗技术 20165318 Exp6 信息搜集与漏洞扫描 原理与实践说明 实践原理 实践内容概述 基础问题回答 实践过程记录 各种搜索技巧的应用 DNS IP注册信息的查询 ...

  8. Hue添加Spark notebook

    参考自https://blogs.msdn.microsoft.com/pliu/2016/06/18/run-hue-spark-notebook-on-cloudera/ 说明 使用Clouder ...

  9. centos时区设置

    [root@ logs]# tzselect Please identify a location so that time zone rules can be set correctly.Pleas ...

  10. 理解WebSocket心跳及重连机制(五)

    理解WebSocket心跳及重连机制 在使用websocket的过程中,有时候会遇到网络断开的情况,但是在网络断开的时候服务器端并没有触发onclose的事件.这样会有:服务器会继续向客户端发送多余的 ...