2018.09.06 警卫安排(树形dp)
描述
太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫。 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状;有边直接相连的宫殿可以互相望见。大内保卫森严,三步一岗,五步一哨,每个宫殿都要有人全天候看守,在不同的宫殿安排看守所需的费用不同。 可是陆小凤手上的经费不足,无论如何也没法在每个宫殿都安置留守侍卫。
编程任务:帮助陆小凤布置侍卫,在看守全部宫殿的前提下,使得花费的经费最少。
输入
输入文件中数据表示一棵树,描述如下:
第1行 n,表示树中结点的数目。
第2行至第n+1行,每行描述每个宫殿结点信息,依次为:该宫殿结点标号i(0< I<=N),在该宫殿安置侍卫所需的经费K,该点的儿子数M,接下来M个数,分别是这个节点的M个儿子的标号R1,R2,…,RM。对于一个n(0 < n<=1500)个结点的树,结点标号在1到n之间,且标号不重复。
输出
输出文件仅包含一个数,为所求的最少的经费。
样例输入
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
树形dp经典题。
注意要考虑儿子和父亲的影响。
用f[i][0]表示选择当前节点的最优值
f[i][1]表示当前节点父亲被选,自己不被选的最优值。
f[i][2]表示当前节点与当前节点父亲均不被选的最优值。
注意第三个至少有一个儿子会被选。
于是有:
f[i][0]=w[i]+∑vmin(f[v][0],f[v][1],f[v][2])" role="presentation" style="position: relative;">f[i][0]=w[i]+∑min(f[v][0],f[v][1],f[v][2])vf[i][0]=w[i]+∑vmin(f[v][0],f[v][1],f[v][2])
f[i][1]=w[i]+∑vmin(f[v][0],f[v][2])" role="presentation" style="position: relative;">f[i][1]=w[i]+∑min(f[v][0],f[v][2])vf[i][1]=w[i]+∑vmin(f[v][0],f[v][2])
f[i][2]=w[i]+∑vmin(f[v][0],f[v][2])" role="presentation" style="position: relative;">f[i][2]=w[i]+∑min(f[v][0],f[v][2])vf[i][2]=w[i]+∑vmin(f[v][0],f[v][2])且至少有一个儿子被选。
代码:
#include<bits/stdc++.h>
#define N 2005
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
int n,first[N],f[N][3],cnt=0,w[N],rt;
bool vis[N];
struct edge{int v,next;}e[N];
inline void add(int u,int v){e[++cnt].v=v,e[cnt].next=first[u],first[u]=cnt;}
inline int min(int a,int b){return a<b?a:b;}
inline int dfs(int p,int k){
if(~f[p][k])return f[p][k];
f[p][k]=(k==0)?w[p]:(k==1?0:2e9);
for(int i=first[p];i;i=e[i].next){
int v=e[i].v;
if(!k)f[p][k]+=min(dfs(v,0),min(dfs(v,1),dfs(v,2)));
else if(k==1)f[p][k]+=min(dfs(v,0),dfs(v,2));
else f[p][k]=min(f[p][k],dfs(p,1)-min(dfs(v,0),dfs(v,2))+f[v][0]);
}
return f[p][k];
}
int main(){
n=read(),memset(f,-1,sizeof(f));
for(int i=1;i<=n;++i){
int u=read(),v,k;
w[u]=read(),k=read();
for(int j=1;j<=k;++j)v=read(),add(u,v),vis[v]=true;
}
for(int i=1;i<=n;++i)if(!vis[i]){rt=i;break;}
cout<<min(dfs(rt,0),dfs(rt,2));
return 0;
}
2018.09.06 警卫安排(树形dp)的更多相关文章
- 2018.09.01 独立集(树形dp)
描述 给定一颗树(边权为1),选取一个节点子集,使得该集合中任意两个节点之间的距离都大于K.求这个集合节点最多是多少 输入 第一行是两个整数N,K 接下来是N-1行,每行2个整数x,y,表示x与y有一 ...
- 警卫安排(dp好题)
警卫安排(guard)[题目描述]一个重要的基地被分为 n 个连通的区域.出于某种神秘的原因,这些区域以一个区域为核心,呈一颗树形分布.在每个区域安排警卫所需要的费用是不同的,而每个区域的警卫都可以望 ...
- 2018.09.05 任务安排(斜率优化dp)
描述 这道题目说的是,给出了n项必须按照顺序完成的任务,每项任务有它需要占用机器的时间和价值.现在我们有一台机器可以使用,它每次可以完成一批任务,完成这批任务所需的时间为一个启动机器的时间S加上所有任 ...
- 2018.09.06 烽火传递(单调队列优化dp)
描述 烽火台是重要的军事防御设施,一般建在交通要道或险要处.一旦有军情发生,则白天用浓烟,晚上有火光传递军情. 在某两个城市之间有 n 座烽火台,每个烽火台发出信号都有一定的代价.为了使情报准确传递, ...
- 【题解】警位安排( 树形 DP)
[题目描述]一个重要的基地被分成了 n 个连通的区域 , 出于某种原因 , 这个基地以某一个区域为核心,呈一树形分布.在每个区域里安排警卫的费用是不同的,而每个区域的警卫都可以望见其相邻的区域 .如果 ...
- 洛谷 4383 [八省联考2018]林克卡特树lct——树形DP+带权二分
题目:https://www.luogu.org/problemnew/show/P4383 关于带权二分:https://www.cnblogs.com/flashhu/p/9480669.html ...
- 2018.09.01 poj3071Football(概率dp+二进制找规律)
传送门 概率dp简单题. 设f[i][j]表示前i轮j获胜的概率. 如果j,k能够刚好在第i轮相遇,找规律可以发现j,k满足: (j−1)>>(i−1)" role=" ...
- 洛谷.4383.[八省联考2018]林克卡特树lct(树形DP 带权二分)
题目链接 \(Description\) 给定一棵边带权的树.求删掉K条边.再连上K条权为0的边后,新树的最大直径. \(n,K\leq3\times10^5\). \(Solution\) 题目可以 ...
- P4383 [八省联考2018]林克卡特树lct 树形DP+凸优化/带权二分
$ \color{#0066ff}{ 题目描述 }$ 小L 最近沉迷于塞尔达传说:荒野之息(The Legend of Zelda: Breath of The Wild)无法自拔,他尤其喜欢游戏中的 ...
随机推荐
- [Vue warn]: Cannot find element: #app
转自:https://blog.csdn.net/linyeban/article/details/54629869 学习vue的时候,刚开始按照官网的例子敲写,却出现以下的问题: 问题:这是因为你的 ...
- word自动生成章节标题
一级目录 二级目录 三级标题
- for 命令详解
FOR有4个参数 /d /l /r /f 他们的作用我在下面用例子解释 FOR /L %%variable IN (start,step,end) DO command [comman ...
- as3 文档类判断是否被加载
if (!stage) { trace(("被加载->this.parent:" + this.parent)); }else { trace(("单独打开-> ...
- ABAP-索引
转载:http://blog.sina.com.cn/s/blog_498610450101kbxl.html tables: csks. start-of-selection. select * u ...
- UI5-文档-2-开发环境
这一部分将指导您安装.配置和设置SAPUI5开发环境的最常见和推荐用例. 请注意:您可以在不同的平台上使用SAPUI5.各自平台的许可和维护条件也适用于SAPUI5.例如,如果在SAP云平台上使用SA ...
- LInux下LD_LIBRARY_PATH的作用与设置
LD_LIBRARY_PATH环境变量主要是用于指定动态链接器(Id)超早elf可执行文件运行时所依赖的动态库(so)的路径,其内容是以冒号分隔的路径列表. Id链接器优先在该变量设置的路径中查找,若 ...
- 一个取消事件的简单js例子(事件冒泡与取消默认行为)
先上代码: <div id='outer' onclick='alert("我是outer")'> <div id="middle" oncl ...
- 由于C++类库版本不同导致的OpenCV编译链接错误
太长不看版:GCC4和GCC5使用的C++标准库下,string的名字不一样,导致链接错误. 之前在Ubuntu下使用OpenCV的时候一切正常.后来再次编译的时候,连接器提示有些库函数找不到: ma ...
- 疯狂JAVA——第三章 数据类型和运算符
3.1注释 1.单行注释 2.多行注释 3.文档注释——文档注释以斜线后紧跟两个星号(/**)开始,以星号后紧跟一个斜线结束(*/),中间部分都是文档注释,会被提取到API文档中. API文档类似于产 ...