题目链接

第一遍不知道为什么就爆零了……

第二遍改了一下策略,思路没变,结果不知道为什么就 A 了???

树形 DP 经典问题:选择最少点以覆盖树上所有点(边)。

对于本题,设 dp[i][0/1][0/1] 表示第 i 个节点,其父亲节点选 / 没选中,且选 / 不选当前节点的最小代价。

发现选中当前点时,周围的点就爱怎样怎样了,自然是选费用小的……没选中时,如果父亲节点选了那同上;

如果父亲也没选,那么对于其子节点:

如果存在一个满足“选择它的代价比不选它的小”,那么一定贪心的选了它,其他的就依然爱怎样怎样了(无情)……

如果没有这样的一个子节点,那就只好选一个费用差的最小的选了它 233。

代码:

 1 #include <queue>
 2 #include <cstdio>
 3 #include <cctype>
 4 #include <cstring>
 5 #include <iostream>
 6 #include <algorithm>
 7 using namespace std;
 8
 9 const int maxn = 1500 + 10;
10 int n, m, head[maxn], val[maxn], dp[maxn][2][2], edge_num;
11
12 struct Edge { int v, nxt; } edge[maxn << 1];
13
14 inline int read() {
15   register char ch = 0; register int w = 0, x = 0;
16   while( !isdigit(ch) ) w |= (ch == '-'), ch = getchar();
17   while( isdigit(ch) ) x = (x * 10) + (ch ^ 48), ch = getchar();
18   return w ? -x : x;
19 }
20
21 inline void Add_edge(int u, int v) {
22   edge[++edge_num].v = v;
23   edge[edge_num].nxt = head[u], head[u] = edge_num;
24 }
25
26 inline void Deep_fs(int x, int p) {
27   int flag = 0, tmp = 1e8;
28   for(int i = head[x]; i; i = edge[i].nxt) {
29     if( edge[i].v == p ) continue;
30     Deep_fs(edge[i].v, x);
31     if( dp[edge[i].v][0][0] >= dp[edge[i].v][0][1] ) flag = 1;
32     dp[x][0][0] = dp[x][0][0] + min(dp[edge[i].v][0][0], dp[edge[i].v][0][1]);
33     dp[x][0][1] = dp[x][0][1] + min(dp[edge[i].v][1][0], dp[edge[i].v][1][1]);
34     dp[x][1][0] = dp[x][1][0] + min(dp[edge[i].v][0][0], dp[edge[i].v][0][1]);
35     dp[x][1][1] = dp[x][1][1] + min(dp[edge[i].v][1][0], dp[edge[i].v][1][1]);
36   }
37   if( !flag ) for(int i = head[x]; i; i = edge[i].nxt) {
38     if( edge[i].v == p ) continue;
39     tmp = min(tmp, dp[x][0][0] - dp[edge[i].v][0][0] + dp[edge[i].v][0][1]);
40   }
41   if( !flag ) dp[x][0][0] = tmp;
42   dp[x][0][1] = dp[x][0][1] + val[x], dp[x][1][1] = dp[x][1][1] + val[x];
43 }
44
45 int main(int argc, const char *argv[])
46 {
47   freopen("..\\nanjolno.in", "r", stdin);
48   freopen("..\\nanjolno.out", "w", stdout);
49
50   scanf("%d", &n);
51   for(int u, v, k, i = 1; i <= n; ++i) {
52     u = read(), val[u] = read(), k = read();
53     for(int j = 1; j <= k; ++j) v = read(), Add_edge(u, v), Add_edge(v, u);
54   }
55   Deep_fs(1, 0), printf("%d\n", min(dp[1][0][0], dp[1][0][1]));
56
57   fclose(stdin), fclose(stdout);
58   return 0;
59 }

 —— 花朵以芬芳熏香了空气;但它最终的任务,是把自己献上给你。
    人们从诗人的字句里,选取自己心爱的意义:但是诗句的最终意义, 是指向着你。

转载于:https://www.cnblogs.com/nanjoqin/p/10078325.html

[SDOI2006] 保安站岗相关推荐

  1. [SDOI2006]保安站岗 树dp

    要记录三种状态: 1.被子节点覆盖 2.等待父节点覆盖 3.建立覆盖节点 然后转移就好了,有一点麻烦的就是被子节点覆盖,需要保证至少有一个子节点建立 注:检查变量名与实际含义. 码: #include ...

  2. SDOI 2006 - 保安站岗

    最小监视覆盖,即选中费用最小的i个点来选中一些边,这些边把所有的点覆盖. #include <cstdio> using namespace std;#define MAXV 1505 # ...

  3. 树形dp+树形结构总结

    总结 最近写了好多树形dp+树形结构的题目,这些题目变化多样能与多种算法结合,但还是有好多规律可以找的. 先说总的规律吧! 一般来说树形dp在设状态转移方程时都可以用f[i][]表示i这颗子树怎么怎么 ...

  4. 洛谷P2016战略游戏

    传送门啦 战略游戏这个题和保安站岗很像,这个题更简单,这个题求的是士兵人数,而保安站岗需要求最优价值. 定义状态$ f[u][0/1] $ 表示 $ u $ 这个节点不放/放士兵 根据题意,如果当前节 ...

  5. gta5显示nat较为严格_一年内上涨近3000元/㎡!碧桂园翡翠华府物业管理严格到令人惊叹...

    近几年南通飞速发展,各种利好背后是新区的崛起,崇川区的地位从未被撼动,当之无愧的中心之中,以南大街商圈为代表的老城区可开发区域基本达到饱和,而以中南商圈为代表的区域迅速发展为我们现在所说的新城区:自南 ...

  6. [职场人生]我的华为3Com两年(原创)

     在华为3Com研发工作了两年,前段时间离职了.看到网上关于华为的帖子满天飞,关于华3的却很少,有的都是些关于收购的传闻,于是萌发了一个想法,写一个简要描述里面情况的帖子,算是给想进去的兄弟姐妹们 ...

  7. 嫁给程序员的十大好处

    医生    医生很危险,我对医生的印象太差,放下他身边女生太多,会跟某个护士小姐跑掉,或是被一个假装生病的年轻女人勾引走不说.而且这种倒霉事还往往发生在你已经为他生了几个小孩的时候.现在的医生都是领提 ...

  8. 电信大型服务器机房_上海电信全华IDC服务器机房

    上海电信全华机房消防报警及灭火系统 消防报警系统采用了智能控制系统,可以准确定位报警点和提示报警信息.温度和烟雾传感器均匀分布各层,准确探测火警信息. 消防联动装置根据报警信号启动灭火装置,关闭新风机 ...

  9. 有一种神一样的学霸,叫北大保安

    过去20多年,北大保安队先后有500余名保安考学深造,有的取大专或本科学历,有的甚至考上研究生,有的毕业后当上了大学老师. 在"丧文化"风靡的互联网,他们的出现似一股清流用&quo ...

最新文章

  1. matlba 正交基
  2. Django book 中文
  3. 电子科技大学计算机考研题,电子科技大学计算机科学与技术考研820历年真题
  4. CodeForces 703C Chris and Road
  5. Discuz!X3.1数据库的操作(三)
  6. 飞鹤、蒙牛、伊利、澳优、合生元、贝因美,谁是未来国产奶粉的扛把子?
  7. 多元分类SVM(多类别SVM)程序使用说明
  8. L1-060 心理阴影面积 (5 分)-PAT 团体程序设计天梯赛 GPLT
  9. 大数据时代的语音识别,方言也不怕?
  10. 小程序素材抓取软件_小程序上新丨2020冬季产品图库更新,海量素材随你用!...
  11. 必应搜索结果跳转百度
  12. 用计算机在作文格中打单字字,二年级信息技术第3—12课教案
  13. Everedit软件下载、安装和运行(免注册)
  14. 0201电脑桌的制作过程(使用3DsMAX2016)
  15. Goroutine调度器及面试精选
  16. css 浮动在最上层_css,如何让background img显示在最上层。
  17. PyCharm中光标变粗的解决方法
  18. 1024. 视频拼接
  19. AI行业态势感知(第七期)
  20. 宝塔控制面板安装禅道开源版教程

热门文章

  1. HTTP协议学习笔记(一)请求方法名及状态码
  2. 每天一道LeetCode-----将二叉树原地平铺成链式结构
  3. netbeans html 格式化,在NetBeans IDE8.0中怎么把html的文件转换成jsp格式
  4. 浮点与定点的二进制存储
  5. HDU - 1429 胜利大逃亡(续) (BFS+状压)
  6. php如何检测图片背景是白色,javascript – 用PHP检测白色图像背景?
  7. Emacs 快速指南
  8. mysql如何explan优化sql_《MySQL数据库》MySQL 优化SQL(explain)
  9. 在Ubuntu中实验环境配置《操作系统原理与实践-李治军》
  10. [BUUCTF-pwn]——[ZJCTF 2019]EasyHeap