题目链接

题意:给出一个树形结构,求P个节点的子树最少要去掉几条边

分析:DP[root][j] 表示 以第 root 个为根节点, 包含j 个节点需要去掉几条边。那么对于 root 这个根节点来说, 要么选择 他的一个 儿子 k, 要么不选择, 如果选择 dp[root][j] = min( dp[k][i] + dp[root][j - i] ), k为root的子节点, 其中  0 < i < j; 如果不选择的话,就去掉root 和 k之间连线,dp[root][j] = dp[root] [j] + 1;

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <cstdio>
  6. using namespace std;
  7. const int Max = ;
  8. const int INF = 0x3f3f3f3f;
  9. vector<int> son[Max];
  10. int n, p;
  11. int indegree[Max];
  12. int dp[Max][Max];
  13. void dfs(int root)
  14. {
  15. int Size = son[root].size();
  16. for (int i = ; i <= p; i++)
  17. dp[root][i] = INF;
  18. dp[root][] = ; //全都设为0,对于叶子节点来说就是0
  19. for (int i = ; i < Size; i++)
  20. {
  21. int u = son[root][i];
  22. dfs(u);
  23. int temp;
  24. for (int j = p; j >= ; j--)
  25. {
  26. temp = dp[root][j] + ; // 不选择u这个子节点,那么就+1
  27. for (int k = ; k < j; k++) // 枚举root的节点个数,所以第一层 i 要从p开始枚举,因为这里要用到 小的,保证小的是上一个状态
  28. {
  29. temp = min(temp, dp[root][k] + dp[u][j - k]);
  30. }
  31. dp[root][j] = temp;
  32. }
  33. }
  34. }
  35.  
  36. int solve(int root)
  37. {
  38. dfs(root);
  39. int ans = dp[root][p]; // 这个子树可能以root为根
  40. for (int i = ; i <= n; i++) // 也可以不以root为根
  41. ans = min(ans, dp[i][p] + );
  42. return ans;
  43.  
  44. }
  45. int main()
  46. {
  47. while (scanf("%d%d", &n, &p) != EOF)
  48. {
  49. for (int i = ; i <= n; i++)
  50. son[i].clear();
  51. memset(indegree, , sizeof(indegree));
  52. int I, J, root;
  53. for (int i = ; i < n; i++)
  54. {
  55. scanf("%d%d", &I, &J);
  56. son[I].push_back(J);
  57. indegree[J]++;
  58. }
  59. for (int i = ; i <= n; i++)
  60. {
  61. if (!indegree[i]) // 找根节点
  62. {
  63. root = i;
  64. break;
  65. }
  66. }
  67.  
  68. printf("%d\n", solve(root));
  69. }
  70. return ;
  71. }

POJ 1947Rebuilding Roads(树形DP + 01背包)的更多相关文章

  1. POJ.3624 Charm Bracelet(DP 01背包)

    POJ.3624 Charm Bracelet(DP 01背包) 题意分析 裸01背包 代码总览 #include <iostream> #include <cstdio> # ...

  2. poj 2923 状压dp+01背包

    好牛b的思路 题意:一系列物品,用二辆车运送,求运送完所需的最小次数,两辆车必须一起走 解法为状态压缩DP+背包,本题的解题思路是先枚举选择若干个时的状态,总状态量为1<<n,判断这些状态 ...

  3. hihoCoder#1055 : 刷油漆 (树形DP+01背包)

    题目大意:给一棵带点权的树,现在要从根节点开始选出m个连通的节点,使总权值最大. 题目分析:定义状态dp(u,m)表示在以u为根的子树从根节点开始选出m个点连通的最大总权值,则dp(u,m)=max( ...

  4. HDU1561:The more, The Better(树形DP+01背包)

    Problem Description ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物.但由于地理位置原因,有 ...

  5. hdu 1561【树形dp+01背包】

    http://acm.hdu.edu.cn/showproblem.php?pid=1561 很容易想到如果是要攻克v城需要先攻克u城的话,可以建u到v的边.但是如果能够直接攻克u城呢?无边可建,这样 ...

  6. 树形DP +01背包(HDU 1011)

    题意:有n个房间,有n-1条道路连接着n个房间,每个房间都有若干个野怪和一定的能量值,有m个士兵从1房间入口进去,到达每个房间必须要留下若干士兵杀死所有的野怪,然后其他人继续走,(一个士兵可以杀死20 ...

  7. HDU 1561 The more, The Better(树形DP+01背包)

    The more, The Better Time Limit : 6000/2000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other ...

  8. POJ 2184 Cow Exhibition【01背包+负数(经典)】

    POJ-2184 [题意]: 有n头牛,每头牛有自己的聪明值和幽默值,选出几头牛使得选出牛的聪明值总和大于0.幽默值总和大于0,求聪明值和幽默值总和相加最大为多少. [分析]:变种的01背包,可以把幽 ...

  9. USACO Money Systems Dp 01背包

    一道经典的Dp..01背包 定义dp[i] 为需要构造的数字为i 的所有方法数 一开始的时候是这么想的 for(i = 1; i <= N; ++i){ for(j = 1; j <= V ...

随机推荐

  1. Oracle中修改表名遇到“ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效”

    Oracle 11g中想修改表名: rename ASSETPORJECT to ASSETPROJECT; 结果提示:ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超 ...

  2. 为什么带网格(mesh)的模型添加了刚体Rigidbody和MeshCollider,还是会从地板穿过去?

    两个Gameobject 放置在空中, 一个是Cube,一个是茄子模型 Cube的Collider 是Box Collider , 茄汁的Collider 是mesh collider, 他们都添加了 ...

  3. MEF

    详情见链接:http://www.cnblogs.com/comsokey/p/MEF1.html#top

  4. 61-umask 简明笔记

    设定在创建文件时的权限掩码 umask [mask] 参数 mask可以是3位八进制数或者是如同在chmod中使用的符号值,mask指定不允许的权限(文件的实际权限是777减去umask值) 如果没有 ...

  5. C#中的Where和Lambda表达式

    1 2 3 4 5 6 7 8 9 10 11 List<string> listString = new List<string>(); listString.Add(&qu ...

  6. Python基础-函数篇

    本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数  函数与函数式编程 1.面向对象: 华山派-- ...

  7. Django- 1- 数据库设置

    更改配置文件中的 字段更改为 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', //按照自己的数据库配置配置,现在所配置 ...

  8. Boundary Representations

    用所有属于boundary的点来表示boundary, 有两个主要的缺点, 一是数据量大, 二是对噪声敏感. 用boundary的一些representation而非精确的boundary本身来表示b ...

  9. selenium+webdriver+python 中警告框的处理方法

    在自动化测试过程中,经常会遇到弹出警告框的情况,如图所示: 在 WebDriver 中处理 JavaScript 所生成的 alert.confirm 以及 prompt 是很简单的.具体做法是使用  ...

  10. c# 百度api语音识别

    public static string getStrAccess(string para_API_key, string para_API_secret_key) { //方法参数说明: //par ...