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)无法自拔,他尤其喜欢游戏中的 ...
随机推荐
- C++实现ping功能<转>
今天接到需求要实现ping的功能,然后网上查了一些资料,对网络编程的一些函数熟悉了一下,虽然还有一些细节不清楚,但是慢慢积累. 要实现这样的功能: 基础知识 ping的过程是向目的IP发送一个type ...
- 常用HTTP状态码
1.常用状态码介绍 在http响应协议中,我们通过HttpWatch抓包抓取到响应信息.其中响应首行中就包含一个状态码.状态码由三位数字组成,表示请求是否被理解或者被满足.HTTP响应状态码的第一个数 ...
- Python之建立APP流程以及SVN 的使用
一, 1)我们先拿到SVN的地址比如说:https://123.com/trunck/nihao 2)执行命令行 svn checkout 此时check out是将项目存到了本地根目录下面,如果想存 ...
- rem 的使用
1.填加以下代码 (function (designWidth, maxWidth) { var doc = document, win = window, docEl = doc.documentE ...
- typscript 语法1
let isDone: boolean = false; let decLiteral: number = 0xf00d; let names: string = 'boob'; /** 使用模版字符 ...
- python: no module named bz2
https://stackoverflow.com/questions/8115280/importerror-no-module-named-bz2-for-python-2-7-2 centos6 ...
- delphi webbrowser 执行 js ---转
EmbeddedWB1.OleObject.document.parentWindow.execScript(memo1.Text, 'javascript');
- Haskell语言学习笔记(58)Bifoldable
Bifoldable class Bifoldable p where bifold :: Monoid m => p m m -> m bifold = bifoldMap id id ...
- 判断是否有TrueType字体
function IsTrueTypeAvailable : bool;var {$IFDEF WIN32} rs : TRasterizerStatus; {$ELSE} rs : TRaste ...
- JDBC之使用配置文件链接数据库
写在前面 JDBC以一种统一的方式来对各种各样的数据库进行存取,JDBC为开发人员隐藏了不同数据库的不同特性.程序员开发时,知道要开发访问数据库的应用,于是将一个对应数据库的JDBC驱动程序类的引用进 ...