【题解】保安站岗[P2458]皇宫看守[LOJ10157][SDOI2006]
【题解】保安站岗[P2458]皇宫看守[LOJ10157][SDOI2006]
传送门:皇宫看守\([LOJ10157]\) 保安站岗 \([P2458]\) \([SDOI2006]\)
【题目描述】
给你一棵树,要求树上每个点都要有人看守,在不同的点安排守卫所需 \(Monney\) 不同。
守卫站在某个端点上时,他除了能看守住他所站的那个点,也能看守通过一条边与之相连的另一个端点,因此一个守卫可能同时能看守住多个点,因此没有必要在每个端点上都安排守卫。
要求在能够看守住所有点的前提下,使得花费的 \(Monney\) 最少。
【输入】
第 \(1\) 行一个整数 \(n\),表示树中节点的数目。
接下来 \(n\) 行,每行描述每个结点的信息,依次为:该结点标号 \(i\),在该结点安置保安所需的经费 \(k_i\),该边的儿子数 \(m\),接下来 \(m\) 个数,分别是这个节点的 \(m\) 个儿子的标号 \(r_1,r_2,r_3...r_m\)。
对于一个 \(n\) 个结点的树,其结点标号在 \(1\) 到 \(n\) 之间,且标号不重复。
【输出】
输出一行一个整数,表示花费的最少 \(Monney\) 。
【样例】
样例输入:
6
1 30 3 2 3 4
2 16 2 5 6
3 5 0
4 4 0
5 11 0
6 5 0
样例输出:
25
【数据范围】
\(100\%\) \(1 \leqslant N \leqslant 1500,1 \leqslant k_i \leqslant 10000\)
【分析】
一道经典的树形 \(dp\) 。
用 \(dp[i][0]\) 表示:自己不是守卫,父亲不是守卫,儿子是守卫。
用 \(dp[i][1]\) 表示:自己是守卫,父亲不知道,儿子不知道。
用 \(dp[i][2]\) 表示:自己不是守卫,父亲是守卫,儿子不知道。
在树上 \(dfs\) 遍历。
每到达一个 \(x\),先对其进行初始化:\(dp[x][1]=w[x],dp[x][2]=dp[x][0]=0\)(其中 \(w[x]\) 为在 \(x\) 这个位置放守卫所需 \(Monney\))。
然后遍历它的若干个儿子结点,更新三个 \(dp[x][?]\):
\((1).\) \(dp[x][1]\):\(x\) 是守卫,\(x\) 的父亲不知道,\(x\) 的儿子 \(to\) 不知道。
对于 \(to\) 来说,\(to\) 的父亲一定是守卫,所以 \(dp[to][0]\) 就不统计了,于是有:\(dp[x][1]=\sum_{to \in son[x]} min(dp[to][1],dp[to][2])\)
\((2).\) \(dp[x][2]\):\(x\) 不是守卫,\(x\) 的父亲是守卫,\(x\) 的儿子 \(to\) 不知道
对于 \(to\) 来说,\(to\) 的父亲不可能是守卫,于是有:\(dp[x][2]=\sum_{to \in son[x]} min(dp[to][1],dp[to][0])\)
\((3).\) \(dp[x][0]\):\(x\) 不是守卫,\(x\) 的父亲不是守卫,\(x\) 的儿子 \(to\) 是守卫
这是最复杂的情况,需要在 \(son[x]\) 选出一个 \(dp[to][1]\),而其他的儿子则是 \(min(dp[to][1],dp[to][0])\)。
可以对所有儿子维护一个 \(dp[to][1]\) 与 \(min(dp[to][1],dp[to][0])\) 的差值 \(dd\),然后在最后把最小的差值 \(dd_{min}\) 加到 \(dp[to][0]\) 上即可。
于是 \(dd={(dp[r][1]-min(dp[r][0],dp[to][1]))}^{r \in son[x]}_{min},\) \(dp[to][0]=\sum_{to \in son[x]} min(dp[r][1],dp[r][0])+dd\)
【Code】
#include<algorithm>
#include<cstring>
#include<cstdio>
#define R register int
using namespace std;
struct QAQ{int to,next;}a[1505];
int m,pan[1505],n,t,w[1505],dp[1505][3],head[1505];
inline void add(int x,int y){a[++t].to=y,a[t].next=head[x],head[x]=t;}
//dp[i][0] 自己不是守卫,父亲不是守卫,儿子是守卫
//dp[i][1] 自己是守卫, 父亲不知道, 儿子不知道
//dp[i][2] 自己不是守卫,父亲是守卫, 儿子不知道
inline void dfs(int x){
R i,to,dd=0xfffffff;
dp[x][1]=w[x];dp[x][2]=0;dp[x][0]=0;
for(i=head[x];i;i=a[i].next){
dfs(to=a[i].to);
dd=min(dd,dp[to][1]-min(dp[to][0],dp[to][1]));//维护最小的差值
dp[x][0]+=min(dp[to][0],dp[to][1]);
//若x守卫是儿子dp[x][0],找到花费最小的dd 加上其他的儿子:min(1.孙子dp[to][0]。2.自己dp[to][1]。)
dp[x][1]+=min(dp[to][1],dp[to][2]);
//若x有守卫dp[x][1],加上儿子:min(1.父亲dp[to][2]。2.自己dp[to][1]。)
dp[x][2]+=min(dp[to][0],dp[to][1]);
//若守卫是父亲dp[x][2],加上儿子:min(1.孙子dp[to][0]。2.自己dp[to][1]。)
}
dp[x][0]+=dd;
}
int main(){
memset(dp,127,sizeof(dp));
scanf("%d",&n);
R i,j,a,k,r;
for(i=1;i<=n;i++){
scanf("%d%d%d",&a,&k,&m);w[a]=k;
for(j=1;j<=m;j++)scanf("%d",&r),pan[r]=1,add(a,r);
}
for(i=1;i<=n;i++)
if(!pan[i]){
dfs(i);
printf("%d",min(dp[i][1],dp[i][0]));
return 0;
}
}
【题解】保安站岗[P2458]皇宫看守[LOJ10157][SDOI2006]的更多相关文章
- C++ 洛谷 P2458 [SDOI2006]保安站岗 from_树形DP
P2458 [SDOI2006]保安站岗 没学树形DP的,看一下. 题目大意:一棵树有N个节点,现在需要将所有节点都看守住,如果我们选择了节点i,那么节点i本身,节点i的父亲和儿子都会被看守住. 每个 ...
- Luogu P2458 [SDOI2006]保安站岗(树形dp)
P2458 [SDOI2006]保安站岗 题意 题目描述 五一来临,某地下超市为了便于疏通和指挥密集的人员和车辆,以免造成超市内的混乱和拥挤,准备临时从外单位调用部分保安来维持交通秩序. 已知整个地下 ...
- 【Luogu2458】保安站岗(动态规划)
[Luogu2458]保安站岗(动态规划) 题面 题目描述 五一来临,某地下超市为了便于疏通和指挥密集的人员和车辆,以免造成超市内的混乱和拥挤,准备临时从外单位调用部分保安来维持交通秩序. 已知整个地 ...
- 洛谷【P2458】[SDOI2006]保安站岗 题解 树上DP
题目描述 五一来临,某地下超市为了便于疏通和指挥密集的人员和车辆,以免造成超市内的混乱和拥挤,准备临时从外单位调用部分保安来维持交通秩序. 已知整个地下超市的所有通道呈一棵树的形状:某些通道之间可以互 ...
- P2458 [SDOI2006]保安站岗[树形dp]
题目描述 五一来临,某地下超市为了便于疏通和指挥密集的人员和车辆,以免造成超市内的混乱和拥挤,准备临时从外单位调用部分保安来维持交通秩序. 已知整个地下超市的所有通道呈一棵树的形状:某些通道之间可以互 ...
- Luogu P2458 [SDOI2006]保安站岗【树形Dp】
题目描述 五一来临,某地下超市为了便于疏通和指挥密集的人员和车辆,以免造成超市内的混乱和拥挤,准备临时从外单位调用部分保安来维持交通秩序. 已知整个地下超市的所有通道呈一棵树的形状:某些通道之间可以互 ...
- 洛谷 P2458 [SDOI2006]保安站岗
题目传送门 解题思路: 树形DP 可知一个点被控制有且仅有一下三种情况: 1.被父亲节点上的保安控制 2.被儿子节点上的保安控制 3.被当前节点上的保安控制 我们设dp[0/1/2][u]表示u节点所 ...
- [Luogu][P2458] [SDOI2006]保安站岗
题目链接 看起来似乎跟最小点覆盖有点像.但区别在于: 最小点覆盖要求所有边在其中,而本题要求所有点在其中. 即:一个点不选时,它的儿子不一定需要全选. 画图理解: 对于这样一幅图,本题中可以这样选择: ...
- [luogu 2458][SDOI2006]保安站岗
题目描述 五一来临,某地下超市为了便于疏通和指挥密集的人员和车辆,以免造成超市内的混乱和拥挤,准备临时从外单位调用部分保安来维持交通秩序. 已知整个地下超市的所有通道呈一棵树的形状:某些通道之间可以互 ...
随机推荐
- 记MacOS抹盘后--使用U盘安装MacOS实录
背景 纯属一时手贱,本想重装系统,结果直接把磁盘抹了,然后联网安装死活安不上.但这里仍然附上联网安装方法: 按键 描述 ⌘+R 重新安装您的 Mac 上装有的最新 macOS(建议操作). Optio ...
- Easypoi实现单模板生成多页wrod文档
EasyPoi可以很方便的通过一个word模板,然后通过填充模板的方式生成我们想要的word文档.但是碰到了一个单模板生成多页数据的场景,比如一个订单详情信息模板,但是有很多订单,需要导入到一 ...
- 【剑指 offer】数组中重复的数字 -- PHP 实现
题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...
- mysql主从复制几个重要的参数
1. relay_log_recovery = 1 当slave从库宕机后,假如relay-log损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的relay-log,并且重新从master上 ...
- Django框架(九)-- 多表操作:一对一、一对多、多对多的增删改,基于对象/双下划线的跨表查询、聚合查询、分组查询、F查询与Q查询
一.创建多表模型 一对一:OneToOneField 一对多:ForeignKey 多对多:ManyToManyField 创建表时,会自动添加一个nid字段,并且自增,所以id可以不用手动创建 On ...
- sql字符转义
/** * sql 内的like % 代表一个或多个字符, _代表一个字符,这都是需要转义的 * @param s * @return */ public static String escapeSp ...
- UGUI:技能冷却效果
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...
- Codeforces A. Playlist(暴力剪枝)
题目描述: Playlist time limit per test 2 seconds memory limit per test 256 megabytes input standard inpu ...
- Hbase优化:(待重点研究)
一.服务端调优 1.参数配置 1).hbase.regionserver.handler.count:该设置决定了处理RPC的线程数量,默认值是10,通常可以调大,比如:150,当请求内容很大(上MB ...
- USACO Clumsy Cows
洛谷 P3056 [USACO12NOV]笨牛Clumsy Cows 洛谷传送门 JDOJ 2323: USACO 2012 Nov Silver 1.Clumsy Cows JDOJ传送门 Desc ...