P1472警卫安排

 
时间限制 : 10000 MS   空间限制 : 65536 KB
问题描述

一个重要的基地被分为n个连通的区域。出于某种神秘的原因,这些区域以一个区域为核心,呈一颗树形分布。
在每个区域安排警卫所需要的费用是不同的,而每个区域的警卫都可以望见其相邻的区域,只要一个区域被一个警卫望见或者是安排有警卫,这个区域就是安全的。你的任务是:在确保所有区域都是安全的情况下,找到安排警卫的最小费用。

输入格式

第一行n,表示树中结点的数目。
接下来的n行描述了n个区域的信息,每一行包含的整数依次为:区域的标号i(0<i<=n),在区域i安排警卫的费用k,区域i的子结点数目m,接下来m个数为区域i的子结点编号。

输出格式

一行一个整数,为最小的安排费用。

样例输入

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

提示

对于所有的数据,0<n<=720。

【题解】
——by 朱全民

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstdlib>
  4 #include <cstring>
  5 #include <cmath>
  6 #include <algorithm>
  7 #define min(a, b) ((a) < (b) ? (a) : (b))
  8 #define max(a, b) ((a) > (b) ? (a) : (b))
  9
 10 inline void read(int &x)
 11 {
 12     x = 0;char ch = getchar(), c = ch;
 13     while(ch < '0' || ch > '9')c = ch, ch = getchar();
 14     while(ch <= '9' && ch >= '0')x = x * 10 + ch - '0', ch = getchar();
 15     if(c == '-')x = -x;
 16 }
 17
 18 const int INF = 0x3f3f3f3f;
 19 const int MAXN = 800 + 10;
 20
 21 int n,cost[MAXN];
 22
 23 struct Edge
 24 {
 25     int u,v,next;
 26     Edge(int _u, int _v, int _next){u = _u;v = _v;next = _next;}
 27     Edge(){}
 28 }edge[MAXN << 1];
 29
 30 int head[MAXN],cnt;
 31
 32 inline void insert(int a, int b)
 33 {
 34     edge[++cnt] = Edge(a,b,head[a]);
 35     head[a] = cnt;
 36 }
 37
 38 int fa[MAXN], dp[MAXN][3];
 39 /*
 40 dp[i][0]表示i放警卫的最小费用
 41 dp[i][1]表示i被儿子看到的最小费用
 42 dp[i][2]表示i被父亲看到的最小费用
 43
 44 dp[i][0] = Σmin(dp[son[i]][2], dp[son[i]][0],dp[son[i][1]) + cost[i]
 45 dp[i][1] = Σmin(dp[son[i]][0], dp[son[i]][1]) + dp[j][0] j从son[i]中除去
 46 dp[i][2] = Σmin(dp[son[i]][1], dp[son[i]][2])
 47 */
 48
 49 void dfs(int u)
 50 {
 51     if(!u)return;
 52     register int num = 0, v, cnt, tmp;//先更新0 2
 53     for(register int pos = head[u];pos;pos = edge[pos].next)
 54     {
 55         v = edge[pos].v;
 56         if(v == fa[u])continue;
 57         fa[v] = u;
 58         ++ num;
 59         dfs(v);
 60         dp[u][0] += min(dp[v][2], min(dp[v][0], dp[v][1]));
 61         dp[u][2] += min(dp[v][1], dp[v][0]);
 62     }
 63     if(!num)
 64     {
 65         dp[u][0] = cost[u];
 66         dp[u][1] = INF;
 67         dp[u][2] = 0;
 68         return;
 69     }
 70     dp[u][0] += cost[u];
 71     dp[u][1] = INF;
 72     for(register int i = 1;i <= num;++ i)
 73     {
 74         cnt = 1;
 75         tmp = 0;
 76         for(register int pos = head[u];pos;pos = edge[pos].next, ++ cnt)
 77         {
 78             v = edge[pos].v;
 79             if(v == fa[u])
 80             {
 81                 -- cnt;
 82                 continue;
 83             }
 84             if(cnt == i)tmp += dp[v][0];
 85             else tmp += min(dp[v][0], dp[v][1]);
 86         }
 87         dp[u][1] = min(dp[u][1], tmp);
 88     }
 89 }
 90
 91 int main()
 92 {
 93     read(n);
 94     register int root, tmp1,tmp2;
 95     for(register int i = 1;i <= n;++ i)
 96     {
 97         read(root),read(cost[root]),read(tmp1);
 98         for(register int j = 1;j <= tmp1;++ j)
 99         {
100             read(tmp2);
101             insert(root, tmp2),insert(tmp2, root);
102         }
103     }
104     dfs(root);
105     printf("%d", min(dp[root][0], dp[root][1]));
106     return 0;
107 }

NKOJ

转载于:https://www.cnblogs.com/huibixiaoxing/p/7503139.html

NKOJ1472 警卫安排相关推荐

  1. 做好自己,一切都是最好的安排

    在这个世界上,每个人都有自己的想法.做法.活法:理念不同,做法不同,活法就不同.不同层次的人,有不同层次的表现:不要去改变别人,做好自己一切都是最好的安排. 在生活中,我们难免会遇到各式各样的人:单纯 ...

  2. (14)某工业生产部门根据国家计划的安排, 拟将某种高效率的5台机器,分配给所属的3个工厂A,B,C,各工厂在获得这种机器后,可以为国家盈利的情况如表4-10所示。

    问题描述: (14)某工业生产部门根据国家计划的安排, 拟将某种高效率的5台机器,分配给所属的3个工厂A,B,C,各工厂在获得这种机器后,可以为国家盈利的情况如表4-10所示.问:这5台机器如何分配给 ...

  3. [BZOJ1572][Usaco2009 Open]工作安排Job

    1572: [Usaco2009 Open]工作安排Job Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1351  Solved: 632 [Sub ...

  4. 1199: 房间安排

    1199: 房间安排 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 1  Solved: 1 [Submit][Status][Web Board] ...

  5. 嵌入式课程安排 嵌入式培训课程大纲参考

    嵌入式是一门综合性的学科,现在学习嵌入式开发不是单纯局限于单片机或者Linux,嵌入式课程中包含着非常多的内容.以粤嵌嵌入式课程进行参考,看看我们要学习嵌入式的话,要掌握哪些必备的技能. 嵌入式课程安 ...

  6. aws lambda使用_使用AWS Lambda安排Slack消息

    aws lambda使用 Migrating to serverless brings a lot of questions. How do you do some of the non-server ...

  7. 中科院 工程硕士专业课 复试考试前的辅导安排

    同学们大家好:    学校定于12月6日.7日组织专业课辅导,1月初进行专业课复试及资格审查. 辅导具体日程安排如下: 12月6日下午13:00  数据结构(报考软件工程.计算机技术领域考生) 人文楼 ...

  8. 麦肯锡顾问深度工作安排:将工作可视化

    工作表安排的三个步骤 凡是善于工作的人,都有一个共通的方法,那就是他们能够有意识或者无意识地使自己的整体工作可视化. 商业系统型的工作安排法: 流程:为了创造价值明确工作的整体流程 分解:将整体流程分 ...

  9. 麦肯锡顾问的整体设计:从大局需要安排工作

    把握成果,工作安排勿要盲人摸象 将必须要做的作业一个不漏地全部网罗进来: 决定作业期限: 让设计图上的内容一目了然: 将最终成果物明确地表示出来. 整体设计图要一目了然 整体设计图上不能只有一项工作, ...

  10. 【通知】2021-2022-1线性代数课程答疑安排

    2021-2022-1线性代数课程答疑安排 本学期线性代数课程答疑安排如下: 答疑时间:每周二 13:00-14:30: 答疑地点:教七楼202(信息教研室): 答疑教师排班如下: 第五周:李鹏,马建 ...

最新文章

  1. jpa-和-mybatis创建的事物管理器名称
  2. 不需要SAP请求号修改程序的方法
  3. tohexstring方法_Java Float类toHexString()方法的示例
  4. [转]动态规划DP的分类
  5. 命令行编译执行java文件
  6. nvidia显示设置不可用_白送大福利?实战FreeSync显示器开启NVIDIA G-Sync Compatible
  7. llinux默认ip修改方法
  8. Access2016学习5
  9. 计算机设置u盘启动,如何设置U盘启动_BIOS设置U盘启动教程 - U当家官网
  10. 安全网站导航 farmsec
  11. python+pygame之飞机大战-第一版源代码分析
  12. python三维图形注释_python – Matplotlib:注释3D散点图
  13. 固态硬盘为啥这么快?带你了解固态硬盘的“秘密”……
  14. 学会Zynq(2)Zynq-7000处理器的配置详解
  15. Flutter 必备开源项目
  16. 在一次班会课上的讲话
  17. 【ANSYS命令流】加载与求解技术(三):集中载荷的施加相关命令(节点、关键点)
  18. im即时通讯开发之后台应用保活、消息推送的噩梦
  19. python爬取图片(正则、bs4、Xpath三种方法)
  20. Android uni-app 封装原生插件

热门文章

  1. 在MyEclipse中使用javadoc导出API文档详解
  2. 通过脚本生成Zabbix Screen报错Incorrect value for field vsize
  3. c++,为什么要引入虚拟继承
  4. 单调队列:temperature
  5. 《Python CookBook2》 第一章 文本 - 测试一个对象是否是类字符串 字符串对齐
  6. eclipse插件:OpenExplorer快速打开文件目录
  7. 转载:如果你到了20岁,还没到 25岁 作者:李开复
  8. Maven 集成Tomcat插件(引用)
  9. JNI学习积累之三 ---- 操作JNI函数以及复杂对象传递
  10. Linux-进程间通信(三): 共享内存