博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj_1464 动态规划
阅读量:5912 次
发布时间:2019-06-19

本文共 1690 字,大约阅读时间需要 5 分钟。

题目大意

    N个节点构成一棵树形结构,在其中若干个节点上放置士兵,与被放置士兵的节点相连的边会被士兵看守。问需要至少在多少个节点上放置士兵,才能使得N-1条边都被看守。

题目分析

    题目描述的结构为树形,且最优化问题,可以考虑使用树形动态规划来解决。将结构按照树根在上,树叶在下的结构进行排列,为了保证无后效性,需要对i节点上有无士兵的情况单独处理,设置状态 dp[i][0] 表示在节点i不放置士兵的情况下,节点i以下的边都被看守所需要放置士兵的最少数目;dp[i][1]表示在节点i放置士兵的情况下,节点i以下的所有边都被看守所需要放置士兵的最少数目。显然有递推关系: 

dp[i][0] = sum{dp[son_of_i][1]} 
dp[i][1] = sum{min{dp[son_of_i][0], dp[son_of_i][1]}}

实现(c++)

#include
#include
#include
#define min(a, b) a < b? a:busing namespace std;vector
gGraph[1505]; //使用 vector
gGraph[1505], 而不使用 vector
> //是因为题目多组数据,若使用 vector
>,则在每组数据都会进行对 外层vecotr的 resize操作,减低效率int dp[1505][2];void Travel(int node){ if (gGraph[node].empty()){ dp[node][0] = 0; //node节点不放置士兵的情况下,node节点以下的所有边都被看守所需要的士兵总数 dp[node][1] = 1; //node节点放置士兵的情况下,node节点以下的所有边都被看守所需要的士兵总数 return; } dp[node][1] = 1; for (int i = 0; i < gGraph[node].size(); i++){ Travel(gGraph[node][i]); //由叶子到根进行递推,后序遍历 //node节点不放置士兵的情况下,需要node节点的子节点都放置士兵 dp[node][0] += dp[gGraph[node][i]][1]; //node节点放置士兵,则其子节点可放可不放,选取最小值即可 dp[node][1] += min(dp[gGraph[node][i]][1], dp[gGraph[node][i]][0]); }}int main(){ int n, root; while (scanf("%d", &n) != EOF){ for (int i = 0; i < n; i++){ gGraph[i].clear(); } int node, num_adjacent, node_adjacent; root = -1; memset(dp, 0, sizeof(dp)); for (int i = 0; i < n; i++){ scanf("%d:(%d)", &node, &num_adjacent); if (root < 0) root = node; for (int j = 0; j < num_adjacent; j++){ scanf("%d", &node_adjacent); gGraph[node].push_back(node_adjacent); } } Travel(root); int result = min(dp[root][0], dp[root][1]); printf("%d\n", result); } return 0;}

 

转载地址:http://bcmpx.baihongyu.com/

你可能感兴趣的文章
[转载]Monit:开源服务器监控工具
查看>>
Linux 打印 颜色显示
查看>>
dubbo请求调用过程分析
查看>>
Oracle学习(一):Oracle数据库基础
查看>>
27. Python对Mysql的操作(2)
查看>>
Linux 中用 strace 追踪系统调用和信号值
查看>>
JAVASE贪吃蛇开发记录
查看>>
mysql全文索引____ft_min_word_len
查看>>
Shiro的记住我功能失效原因
查看>>
对Node的优点和缺点提出了自己的看法?
查看>>
序列化有关内容
查看>>
Jmeter变量参数化及函数应用
查看>>
代码整洁之道-第9章-单元测试-读书笔记
查看>>
195. Spring Boot 2.0数据库迁移:Flyway
查看>>
集成支付宝SDK时错误的解决办法
查看>>
C++ ssd5 12 optional exercise2
查看>>
如何调用带返回值类型的函数
查看>>
数据库设计,表与表的关系,一对一。One-To-One(1)
查看>>
Building QT projects from the command line
查看>>
JSP
查看>>