描述

太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫。 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状;有边直接相连的宫殿可以互相望见。大内保卫森严,三步一岗,五步一哨,每个宫殿都要有人全天候看守,在不同的宫殿安排看守所需的费用不同。 可是陆小凤手上的经费不足,无论如何也没法在每个宫殿都安置留守侍卫。



编程任务:帮助陆小凤布置侍卫,在看守全部宫殿的前提下,使得花费的经费最少。

输入

输入文件中数据表示一棵树,描述如下:

第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)的更多相关文章

  1. 2018.09.01 独立集(树形dp)

    描述 给定一颗树(边权为1),选取一个节点子集,使得该集合中任意两个节点之间的距离都大于K.求这个集合节点最多是多少 输入 第一行是两个整数N,K 接下来是N-1行,每行2个整数x,y,表示x与y有一 ...

  2. 警卫安排(dp好题)

    警卫安排(guard)[题目描述]一个重要的基地被分为 n 个连通的区域.出于某种神秘的原因,这些区域以一个区域为核心,呈一颗树形分布.在每个区域安排警卫所需要的费用是不同的,而每个区域的警卫都可以望 ...

  3. 2018.09.05 任务安排(斜率优化dp)

    描述 这道题目说的是,给出了n项必须按照顺序完成的任务,每项任务有它需要占用机器的时间和价值.现在我们有一台机器可以使用,它每次可以完成一批任务,完成这批任务所需的时间为一个启动机器的时间S加上所有任 ...

  4. 2018.09.06 烽火传递(单调队列优化dp)

    描述 烽火台是重要的军事防御设施,一般建在交通要道或险要处.一旦有军情发生,则白天用浓烟,晚上有火光传递军情. 在某两个城市之间有 n 座烽火台,每个烽火台发出信号都有一定的代价.为了使情报准确传递, ...

  5. 【题解】警位安排( 树形 DP)

    [题目描述]一个重要的基地被分成了 n 个连通的区域 , 出于某种原因 , 这个基地以某一个区域为核心,呈一树形分布.在每个区域里安排警卫的费用是不同的,而每个区域的警卫都可以望见其相邻的区域 .如果 ...

  6. 洛谷 4383 [八省联考2018]林克卡特树lct——树形DP+带权二分

    题目:https://www.luogu.org/problemnew/show/P4383 关于带权二分:https://www.cnblogs.com/flashhu/p/9480669.html ...

  7. 2018.09.01 poj3071Football(概率dp+二进制找规律)

    传送门 概率dp简单题. 设f[i][j]表示前i轮j获胜的概率. 如果j,k能够刚好在第i轮相遇,找规律可以发现j,k满足: (j−1)>>(i−1)" role=" ...

  8. 洛谷.4383.[八省联考2018]林克卡特树lct(树形DP 带权二分)

    题目链接 \(Description\) 给定一棵边带权的树.求删掉K条边.再连上K条权为0的边后,新树的最大直径. \(n,K\leq3\times10^5\). \(Solution\) 题目可以 ...

  9. P4383 [八省联考2018]林克卡特树lct 树形DP+凸优化/带权二分

    $ \color{#0066ff}{ 题目描述 }$ 小L 最近沉迷于塞尔达传说:荒野之息(The Legend of Zelda: Breath of The Wild)无法自拔,他尤其喜欢游戏中的 ...

随机推荐

  1. 5.mybatis实战教程(mybatis in action)之五:与spring3集成(附源码)

    转自:https://blog.csdn.net/nnn9223643/article/details/41962097 在 这一系列文章中,前面讲到纯粹用mybatis 连接数据库, 然后 进行增删 ...

  2. XMLTransformProvider

    XMLTransformProvider1 XMLTransformProvider1.TransformRead.SourceXmlDocument := XMLDoc.GetDOMDocument ...

  3. js倒计时发送验证码按钮

    var wait=60; function time(o) { if (wait == 0) { o.removeAttribute("disabled"); o.value=&q ...

  4. OpenSL ES 查询设备支持的SL Profiles

    opensl es 提供了三种类型:分别是 SL_PROFILES_PHONE(手机):SL_PROFILES_MUSIC(音乐); SL_PROFILES_GAME (游戏). 如果你使用的手机的开 ...

  5. HTTP状态码 解析

    原文地址:HTTP状态码:400500错误代码(个人总结)作者:lining2008net 一些常见的状态码为: 200-服务器成功返回网页 404-请求的网页不存在 503-服务不可用 详细分解: ...

  6. Asp.net MVC重要

    1.asp.net mvc百度解释 2.asp.net mvc各版本特点 3.asp.net mvc知多少 4.asp.net mvc4入门到精通系列目录汇总(邹琼俊)[重要] 5.新年奉献MVC+E ...

  7. [图解tensorflow源码] 入门准备工作

     tensorflow使用了自动化构建工具bazel.脚本语言调用c或cpp的包裹工具swig.使用EIGEN作为矩阵处理工具.Nvidia-cuBLAS GPU加速计算库.结构化数据存储格式prot ...

  8. git基本命令之删除撤销操作

    1.将删除文件恢复--撤销所删除的文件git checkout 文件名 2.git resetgit reset --hard commitID(或某个节点)----强制切换到某个点,会导致所修改的内 ...

  9. 用R进行统计学分析

    1.基本统计 summary函数:R中的summary函数根据输入的类提供输入的摘要.该函数根据输入对象的类调用各种函数.返回值也取决于输入对象.例如,如果输入是一个由数字数据组成的向量,它将为数据提 ...

  10. C函数指针的用法

    1.最简单的用法: #include <cstdio> int (*p)(int);//定义一个函数指针变量p(下面的f其实是一个常量函数指针) int f(int x) { printf ...