Description

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

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

Input

输入文件中数据表示一棵树,描述如下:
第1行 n,表示树中结点的数目。
第2行至第n+1行,每行描述每个宫殿结点信息,依次为:该宫殿结点标号i(0对于一个n(0 < n<=1500)个结点的树,结点标号在1到n之间,且标号不重复。

Output

输出文件仅包含一个数,为所求的最少的经费。
Sample Output

Sample Input

6
1 30 3 2 3 4
2 16 2 5 6
3 5 0
4 4 0
5 11 0
6 5 0

Sample Output

25

思路:
我们先设
1 : f [ i ] [ 1 ] 为 当 前 i 节 点 放 守 卫 , 需 要 的 最 小 费 用 1:f[i][1]为当前i节点放守卫,需要的最小费用 1:f[i][1]为当前i节点放守卫,需要的最小费用
2 : f [ i ] [ 2 ] 为 当 前 i 节 点 不 放 守 卫 , 被 它 的 子 节 点 监 视 2:f[i][2]为当前i节点不放守卫,被它的子节点监视 2:f[i][2]为当前i节点不放守卫,被它的子节点监视
3 : f [ i ] [ 3 ] 为 当 前 i 节 点 不 放 守 卫 , 被 它 的 父 亲 监 视 3:f[i][3]为当前i节点不放守卫,被它的父亲监视 3:f[i][3]为当前i节点不放守卫,被它的父亲监视
然后一步步思考,怎么样转移


首先,我们思考1
如果它当前放守卫,那么它的儿子节点可放可不放,都会被监视。于是,我们就有:

for(int i=head[x]; i; i=b[i].next)
{long long y=b[i].to;VL_dp(y);f[x][1]+=min(f[y][1], min(f[y][2], f[y][3]));
}

然后,我们思考2
我们先分析2代表当前i节点不放守卫,被它的子节点监视,也就是不是它去监视它儿子,那我们可以在它儿子这里放守卫,也可以在它儿子的儿子放守卫,就会监视到它儿子。
然后我们思考,当前 x x x必须要被其中一个儿子监视,也就是说要在它众多儿子中选一个出来监视,于是这个儿子就必须放守卫,我们就有:

long long tmp=0;
for(int i=head[x]; i; i=b[i].next)
{int y=b[i].to;tmp+=min(f[y][1], f[y][2]);//在儿子这放,还是在儿子的儿子放,哪个优
}
f[x][2]=2147483647;
for(int i=head[x]; i; i=b[i].next)
{int y=b[i].to;f[x][2]=min(f[x][2], tmp-min(f[y][1], f[y][2])+f[y][1]);//挑选出一个儿子用来监视它
}

最后我们思考3
3就比较简单,被父亲监视,也就是说它儿子必须被它儿子的儿子监视,这样它儿子才不会监视到它。最后我们就有:

for(int i=head[x]; i; i=b[i].next)
{long long y=b[i].to;f[x][3]+=f[y][2];
}

总结代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
using namespace std;long long n, tot, v[1001000], head[1001000], a[1000100];long long f[1001000][4];struct node
{long long to, next;
}b[1000100];void VL_ljb(long long x, long long y)
{b[++tot]=(node){y, head[x]};head[x]=tot;
}void VL_dp(long long x)
{for(int i=head[x]; i; i=b[i].next){long long y=b[i].to;VL_dp(y);f[x][1]+=min(f[y][1], min(f[y][2], f[y][3]));f[x][3]+=f[y][2]; }f[x][1]+=a[x];long long tmp=0;for(int i=head[x]; i; i=b[i].next){int y=b[i].to;tmp+=min(f[y][1], f[y][2]);}f[x][2]=2147483647;for(int i=head[x]; i; i=b[i].next){int y=b[i].to;f[x][2]=min(f[x][2], tmp-min(f[y][1], f[y][2])+f[y][1]);}
}int main()
{scanf("%lld", &n);for(long long i=1; i<=n; i++){long long x;scanf("%lld", &x);scanf("%lld", &a[x]);long long k;scanf("%lld", &k);for(long long j=1; j<=k; j++){long long y;scanf("%lld", &y);VL_ljb(x, y);//有向图v[y]++;//从根开始,因为它是棵树} }for(int i=1; i<=n; i++){if(v[i]==0){VL_dp(i);printf("%lld", min(f[i][1], f[i][2]));//根已经没有父节点了,所以不用3}}return 0;
}

【SSL1608】皇宫看守相关推荐

  1. AcWing 1077. 皇宫看守(树形DP + 状态机DP)

    AcWing 1077. 皇宫看守(树形DP + 状态机DP) 一.问题 二.分析 1.思路分析 2.状态表示 3.状态转移 4.循环设计 5.初末状态 三.代码 一.问题 二.分析 1.思路分析 在 ...

  2. Acwing 1077.皇宫看守

    Acwing 1077.皇宫看守 题目 输入格式 输出格式 数据范围 输入样例 输出样例 样例解释 分析 详细代码 这是我第一篇博客,如有侵权或者不足的地方,我将予以修改,并改正 题目 太平王世子事件 ...

  3. Acwing 1077. 皇宫看守

    参考题目:Acwing 1077. 皇宫看守 题意 给定一个树,求覆盖所有点的最少花费. 算法:树形DP 时间复杂度: O ( n ) O(n) O(n) (每个点只被搜索一次) f 数组含义: f[ ...

  4. 【ssl1608】皇宫看守【树形DP】

    Description 太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状:某些宫殿间可以互相望见.大内保卫森严,三步一岗,五步一哨,每个宫殿 ...

  5. AcWing1077. 皇宫看守(树形DP)题解

    题目传送门 题目描述 太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状,某些宫殿间可以互相望见. 大内保卫森严,三步一岗,五步一哨,每个宫殿 ...

  6. CIA1 皇宫看守(树形dp)

    问题描述:太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状:某些宫殿间可以互相望见.大内保卫森严,三步一岗,五步一哨,每个宫殿都要有人全天候 ...

  7. 皇宫看守(guard)

    [问题描述] 太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状:有边直接相连的宫殿可以互相望见.大内保卫森严,三步一岗,五步一哨,每个宫殿都 ...

  8. TYWZOJ[1580]皇宫看守

    题目描述 太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状,某些宫殿间可以互相望见.大内保卫森严,三步一岗,五步一哨,每个宫殿都要有人全天候 ...

  9. 皇宫看守【SGOI-2】

    题目描述 问题描述: 太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状:某些宫殿间可以互相望见.大内保卫森严,三步一岗,五步一哨,每个宫殿都 ...

  10. 1077. 皇宫看守

    太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫. 皇宫各个宫殿的分布,呈一棵树的形状,宫殿可视为树中结点,两个宫殿之间如果存在道路直接相连,则该道路视为树中的一条边. 已知,在一个宫殿镇守的守卫不 ...

最新文章

  1. 侏罗纪怪兽世界怎么登陆服务器未响应,全金属怪物进不去怎么解决
  2. Tomcat安装之在Mac环境下配置tomcat9
  3. Go 语言 练习 聊天室 01
  4. 深入分析驴子系列(2)
  5. 深度学习二(Pytorch物体检测实战)
  6. java 不同类之间传递数据_java 数据在不同类之间的传递
  7. 经典的出入库算法(C#实现)
  8. 博客随笔《文章目录——java》大纲
  9. 大数据shipin教程_尚硅谷大数据视频教程,粉丝众多,人手一套尚硅谷教程
  10. 熟练运用计算机的重要性,计算机专业实习目的和意义
  11. 【浅墨著作】 OpenCV3编程入门 内容简介 勘误 配套源代码下载
  12. 安卓端录像并将视频分享给微信好友
  13. 探讨!自媒体的推荐机制提高百家号阅读收益方法!
  14. 手机IMEI串码获取
  15. 金融科技B端市场群雄争霸 PATH四家各出奇招
  16. 快速安装AXURE谷歌扩展插件
  17. java 获得jtextarea_java JTextArea中获得光标所在行数
  18. 对比分析方法,数据异动的假设,如何找出羊毛党
  19. 原神QQ机器人云崽bot安卓手机整合包解压即用安装教程
  20. 信息系统项目管理师笔记

热门文章

  1. JS:监听网络状态,给予用户提示
  2. shell除法保留两位小数
  3. oracle 安装详解
  4. 为什么spring的事务注解@Transaction只能用在public方法上
  5. 百度在线笔试题-裁减网格纸
  6. Python的高级图像处理
  7. 深度学习之电影二分类的情感问题
  8. 玩转HttpRunner 框架,再累也没“黑眼圈”
  9. 未来的量子计算机对人类的影响,量子计算机和可控核聚变,哪一个对人类未来的影响更大?...
  10. “第六届世界声博会暨2023科大讯飞全球1024开发者节”开幕式回顾及舆情问题