[HNOI2003]消防局的设立
题目描述
2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地。起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状结构。如果基地A到基地B至少要经过d条道路的话,我们称基地A到基地B的距离为d。
由于火星上非常干燥,经常引发火灾,人类决定在火星上修建若干个消防局。消防局只能修建在基地里,每个消防局有能力扑灭与它距离不超过2的基地的火灾。
你的任务是计算至少要修建多少个消防局才能够确保火星上所有的基地在发生火灾时,消防队有能力及时扑灭火灾。
输入输出格式
输入格式:
输入文件名为input.txt。
输入文件的第一行为n (n<=1000),表示火星上基地的数目。接下来的n-1行每行有一个正整数,其中文件第i行的正整数为a[i],表示从编号为i的基地到编号为a[i]的基地之间有一条道路,为了更加简洁的描述树状结构的基地群,有a[i]<i。
输出格式:
输出文件名为output.txt
输出文件仅有一个正整数,表示至少要设立多少个消防局才有能力及时扑灭任何基地发生的火灾。
输入输出样例
6
1
2
3
4
5
2
类比距离为1的题,这题应该是树形dp,但是状态可能会多一些
1、状态的设计:
f[i][0]: 表示选了自己
f[i][1]: 表示选了儿子
f[i][2]: 表示选了孙子
——上面用来表示这个点被覆盖了的状态,下面为这个点没有被覆盖的状态
f[i][3]: 表示自己不一定被覆盖,但是儿子一定全部被覆盖
f[i][4]: 表示自己和儿子都不一定被覆盖,但是孙子一定全部都被覆盖
2、状态的更新
f[i][0] = 1+Σmin(f[j][0...4]);
f[i][1] = min( f[k][0] + Σ(j != k)min(f[j][0...3]) );
f[i][2] = min( f[k][1] + Σ(j != k)min(f[j][0...2]) );
f[i][3] = Σf[j][0...2];
f[i][4] = Σf[j][0...3];
3、状态的简化 上面的状态貌似已经可以搞了,但是我们发现上面有很多...,可以合并
令f[i][j] = min(f[i][0...j]) (j >= 2)
f[i][0] = 1+Σf[j][4];
f[i][1] = min( f[k][0] + Σ(j != k)f[j][3] )
= Σf[j][3] + min(f[k][0]-f[k][3])
= f[i][4] + min(f[k][0]-f[k][3]);
f[i][2] = min( f[k][1] + Σ(j != k)f[j][2] )
= Σf[j][2] + min(f[k][1]-f[k][2])
= f[i][3] + min(f[k][1]-f[k][2]);
f[i][3] = Σf[j][2];
f[i][4] = Σf[j][3];
最后再更新一遍,使得f[i][j] = min(f[i][0...j]) (j >= 2)
f[1][2]即为答案,O(n+m)的复杂度(貌似n为1000,邻接矩阵n^2也可通过)
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct Node
{
int next,to;
}edge[];
int head[],num,f[][],n;
void add(int u,int v)
{
num++;
edge[num].next=head[u];
head[u]=num;
edge[num].to=v;
}
void dfs(int x,int pa)
{int i;
f[x][]=;
for (i=head[x];i;i=edge[i].next)
{
int v=edge[i].to;
if (v!=pa)
{
dfs(v,x);
f[x][]+=f[v][];
f[x][]+=f[v][];
f[x][]+=f[v][];
}
}
int x2=2e9,x1=2e9;
for (i=head[x];i;i=edge[i].next)
{
int v=edge[i].to;
x2=min(x2,f[v][]-f[v][]);
x1=min(x1,f[v][]-f[v][]);
}
f[x][]=x2+f[x][];
f[x][]=x1+f[x][];
f[x][]=min(f[x][],min(f[x][],f[x][]));
f[x][]=min(f[x][],f[x][]);
f[x][]=min(f[x][],f[x][]);
}
int main()
{int i,j,x;
cin>>n;
for (i=;i<=n;i++)
{
scanf("%d",&x);
add(x,i);
}
dfs(,);
cout<<min(f[][],min(f[][],f[][]));
}
[HNOI2003]消防局的设立的更多相关文章
- BZOJ 1217: [HNOI2003]消防局的设立( 贪心 )
一个简单的贪心, 我们只要考虑2个消防局设立的距离为5时是最好的, 因为利用最充分. 就dfs一遍, 再对根处理一下就可以了. 这道题应该是SGU某道题的简化版...这道题距离只有2, 树型dp应该也 ...
- P2279 [HNOI2003]消防局的设立
P2279 [HNOI2003]消防局的设立考场上想出了贪心策略,但是处理细节时有点问题,gg了.从(当前深度最大的节点)叶子节点往上跳k个,在这里设消防局,并从消防局遍历k个距离,标记上. #inc ...
- 【BZOJ1217】[HNOI2003]消防局的设立 树形DP
[BZOJ1217][HNOI2003]消防局的设立 Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地, ...
- [HNOI2003]消防局的设立 (贪心)
[HNOI2003]消防局的设立 题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达, ...
- BZOJ1217: [HNOI2003]消防局的设立
BZOJ1217: [HNOI2003]消防局的设立 Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地. 起初为了节约材料,人类只修建了n-1条道路来连接这些基地 ...
- [luogu]P2279 [HNOI2003]消防局的设立[贪心]
[luogu]P2279 [HNOI2003]消防局的设立 题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两 ...
- 【洛谷P2279】[HNOI2003]消防局的设立
消防局的设立 题目链接 贪心:每次取出深度最大的节点,若没有被覆盖到,要想覆盖它, 最优的做法显然是将它的爷爷设为消防局 (因为该节点深度为最大,选兄弟.父亲所覆盖的节点,选了爷爷后都能够覆盖) 用优 ...
- bzoj 1217 [HNOI2003]消防局的设立 Label:图论
题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状 ...
- 洛谷P2279 [HNOI2003]消防局的设立
题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状 ...
随机推荐
- 设置如何远程连接mysql数据库
安装好mysql5.6.37后,默认情况下,只允许本地登录,禁止远程登录. 可以现在本地安装好连接工具,比如sqlyog或者navicat 登陆后,切换至mysql数据库 执行下面2条语句 '; FL ...
- mahony互补滤波器C编程
//gx...分别为重力加速度在三个轴向的分力 由加速度计测得 //ax...分别为角速度在三个轴向的角速度 由陀螺仪测得 //最后得到最终滤波完毕的x.y.z方向的角度值(°) void IMUup ...
- 关于webService发布的wsdl中的import问题解决
大家都知道jdk1.6及以后都支持了对webService的原生态的支持:它在发布时会生成一个wsdl和一个xsd(一个类只生成一个xsd)所以就保留了引用关系,如下: <?xml versio ...
- nyoj 鸡兔同笼
鸡兔同笼 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描述 已知鸡和兔的总数量为n,总腿数为m.输入n和m,依次输出鸡和兔的数目,如果无解,则输出"No an ...
- 03-移动端开发教程-CSS3新特性(下)
1. CSS3动画 1.1 过渡的缺点 transition的优点在于简单易用,但是它有几个很大的局限. transition需要事件触发,所以没法在网页加载时自动发生. transition是一次性 ...
- linux下安装配置jdk(解压版)
在linux下登录oracle官网,下载解压版jdk 传送门 系统默认下载到"下载"目录中 创建要将该文件解压的文件夹: 其中 -p 参数代表递归创建文件夹(可以创建多级目录 ...
- RocketMQ(二):RPC通讯
匠心零度 转载请注明原创出处,谢谢! RocketMQ网络部署图 NameServer:在系统中是做命名服务,更新和发现 broker服务. Broker-Master:broker 消息主机服务器. ...
- LeetCode & Q121-Best Time to Buy and Sell Stock-Easy
Array DP Description: Say you have an array for which the ith element is the price of a given stock ...
- 剑指offer-两个链表的第一个公共节点
题目描述 输入两个链表,找出它们的第一个公共结点. 解题思路 分析可得如果两个链表有公共节点,那么公共节点出现在两个链表的尾部,即从某一节点开始,两链表之后的节点全部相等.可以首先遍历两个链表得出各自 ...
- AngularJS1.X学习笔记11-服务
如果我没记错的话,spring里边有个service层.什么是服务呢?个人理解就是很多地方要用的,可以跨越控制器甚至是跨越模块的工具.AngularJS也为我们提供了服务这种机制,这让我们可以将一些不 ...