http://blog.csdn.net/woshi250hua/article/details/7632785

这道题我一开始想的dp[i][j],i是节点,j是删除的点数,dp是最少删边的个数,然而状态转移方程不太好想。

而题解其实差不多,只不过j为剩余点的个数

这样我们就有最初状态,dp[i][1] = 子节点个数,而dp[i][j]就可以从子节点的状态推出来

dp[i][j] = min(dp[i][j],dp[i][k]-1+dp[s][j-k])  (1<=i<=n,2<=j<=sum(节点总和),1<=k<j,s为i子节点)(i中已有k个节点并从s中选择j-k个,算最少删除边数,s选上所以i->s的边不需删除,所以-1)

  1. #include <iostream>
  2. #include <string>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <cstdio>
  6. #include <cmath>
  7. #include <algorithm>
  8. #include <stack>
  9. #include <queue>
  10. #include <cctype>
  11. #include <vector>
  12. #include <iterator>
  13. #include <set>
  14. #include <map>
  15. #include <sstream>
  16. using namespace std;
  17.  
  18. #define mem(a,b) memset(a,b,sizeof(a))
  19. #define pf printf
  20. #define sf scanf
  21. #define spf sprintf
  22. #define pb push_back
  23. #define debug printf("!\n")
  24. #define MAXN 1010
  25. #define MAX(a,b) a>b?a:b
  26. #define blank pf("\n")
  27. #define LL long long
  28. #define ALL(x) x.begin(),x.end()
  29. #define INS(x) inserter(x,x.begin())
  30. #define pqueue priority_queue
  31. #define INF 0x3f3f3f3f
  32.  
  33. int n,m;
  34.  
  35. struct node
  36. {
  37. int y,next;
  38. }tree[];
  39.  
  40. int head[],dp[][],ptr=;
  41.  
  42. int sum[],vl[],vis[];
  43.  
  44. void add(int x,int y)
  45. {
  46. tree[ptr].y = y;
  47. tree[ptr].next = head[x];
  48. head[x] = ptr++;
  49. }
  50.  
  51. void dfs(int root)
  52. {
  53. if(vis[root]) return;
  54. int i,j,k;
  55. vis[root] = sum[root] = ;
  56. int tot = ;
  57.  
  58. for(i=head[root]; i!=-; i=tree[i].next)
  59. {
  60. int p = tree[i].y;
  61.  
  62. if(!vis[p])
  63. {
  64. dfs(p);
  65. sum[root]+=sum[p];
  66. tot++;
  67. //pf("i%d p%d tot%d sum%d\n",root,p,tot,sum[root]);
  68. }
  69. }
  70.  
  71. dp[root][] = tot;
  72.  
  73. for(i=head[root]; i!=-; i=tree[i].next)
  74. {
  75. int p = tree[i].y;
  76.  
  77. for(j = sum[root];j>;j--)
  78. {
  79. for(k = ;k<j;k++)
  80. {
  81. if(dp[root][k]!=INF && dp[p][j-k]!=INF)
  82. {
  83. dp[root][j] = min(dp[root][j],dp[root][k]+dp[p][j-k]-);
  84. //pf("i%d j%d k%d p%d dp%d\n",root,j,k,p,dp[root][j]);
  85. }
  86. }
  87. }
  88. }
  89. }
  90.  
  91. int main()
  92. {
  93. int i,j,k,a,b;
  94. while(~sf("%d%d",&n,&m) && m+n>)
  95. {
  96. mem(head,-);
  97. ptr = ;
  98.  
  99. for(i=;i<=n-;i++)
  100. {
  101. sf("%d%d",&a,&b);
  102. add(a,b);
  103. add(b,a);
  104. }
  105.  
  106. mem(dp,INF);
  107. mem(vis,);
  108. dfs();
  109. int ans = INF;
  110. for (i = ; i <= n; ++i) {
  111.  
  112. if (i == )
  113. ans = min(ans,dp[i][m]);
  114. else ans = min(ans,dp[i][m]+);//非根节点要删除连到父亲节点的那条边
  115. }
  116. printf("%d\n",ans);
  117. }
  118. return ;
  119. }

poj 1947 树形背包 (删边)的更多相关文章

  1. poj 1947 树形背包

    重做这道题 http://blog.csdn.net/woshi250hua/article/details/7632785 http://blog.csdn.net/shuangde800/arti ...

  2. poj 1155 树形背包

    http://blog.csdn.net/libin56842/article/details/9908199 树形背包: 首先是建树,每个结构体为一个节点,包括下一个点序号,值,和next. tre ...

  3. poj 1947(树形DP+背包)

    Rebuilding Roads Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 10663   Accepted: 4891 ...

  4. POJ 1155 树形背包(DP) TELE

    题目链接:  POJ 1155 TELE 分析:  用dp[i][j]表示在结点i下最j个用户公司的收益, 做为背包处理.        dp[cnt][i+j] = max( dp[cnt][i+j ...

  5. poj 1947 树形dp

    思路:dp[i][j]表示,以i节点为根,删去j个节点最少要断几条边. 那么dp[u][j]=min(dp[u][j],dp[v][k]+dp[u][j-k]);//选取最优状态 dp[u][j]=m ...

  6. POJ 1155-TELE(树形背包)

    题意:电视台发送信号给很多用户,每个用户(叶子节点)有愿意出的钱,电视台经过的路线都有一定费用,求电视台不损失的情况下最多给多少用户发送信号. 分析:问题与以i为根节点的子树所包含的叶子数 #incl ...

  7. POJ 2486 树形背包DP Apple Tree

    设d(u, j, 0)表示在以u为根的子树中至多走k步并且最终返回u,能吃到的最多的苹果. 则有状态转移方程: #include <iostream> #include <cstdi ...

  8. UVa 1407 树形背包 Caves

    这道题可以和POJ 2486 树形背包DP Apple Tree比较着来做. 参考题解 #include <iostream> #include <cstdio> #inclu ...

  9. POJ 1155 (树形DP+背包+优化)

    题目链接: http://poj.org/problem?id=1155 题目大意:电视台转播节目.对于每个根,其子结点可能是用户,也可能是中转站.但是用户肯定是叶子结点.传到中转站或是用户都要花钱, ...

随机推荐

  1. JS关闭页面弹窗提醒

    <html> <head><title>JS测试</title> <script type="text/javascript" ...

  2. vue数据响应的坑

    1.首先遇到的第一个坑是数组 vue初始化时,data是一个数组并且为空的时候,里面有一些对象元素,直接改变这些对象的的属性不会触发视图更新 解决办法,copy一个新的数组(vue.assign是浅c ...

  3. css3中的translate,transform,transition的区别

    translate:移动,transform的一个方法               通过 translate() 方法,元素从其当前位置移动,根据给定的 left(x 坐标) 和 top(y 坐标) ...

  4. 面试笔试(C++部分)

    1.define 和const,inline的区别 define的缺点: 1.边界效应(必须加括号,才能避免边界效应) #define MUL(A,B) A*B 而在使用的时候,这样的调用: ,b=, ...

  5. ubuntu下面的某些软件安装

    1. python 下面的mysql驱动:不是在pip里面安装,执行下面命令 apt-get install python-mysqldb

  6. (STM32F4) SysTick理解使用

    關於Cortex System Timer (Systick) 網上隨便google就可以找到許多相關範例. 他就是ARM提供的一個24-bit的下數(count-down)計時器我看大部分應用都是提 ...

  7. PostMan --API调试工具

    https://blog.csdn.net/fxbin123/article/details/80428216

  8. Java中String与Date格式之间的转换

    转自:https://blog.csdn.net/angus_17/article/details/7656631 经常遇到string和date之间的转换,把相关的内容总结在这里吧: 1.strin ...

  9. proxyTable设置跨域

    如何设置跨域 1.在config--index.js 中配置 proxyTable: { '/api': { target: 'http://www.xxx.com', //目标接口域名 change ...

  10. Ionic3,组件的使用(四)

    说明 因为同样是作为 Ionic3 小白,所以很多东西都是自己摸索出来的,可能有很多不合理的地方,请多多指正. 效果图 细节说明 一:组件.页面均采用 懒加载: 二:页面的头部标题栏,采用了组件化的方 ...