题目链接:https://vjudge.net/problem/POJ-1947

题意:给定一棵树,求得到一个结点数为p最少删多少条边。

思路:

  明显的树形dp,分组背包。用dp[u][j]表示在结点u的子树上选j个结点最少要删除的边(一定包含结点u),那么dp[u][1]=num[u],num[u]表示结点u的子结点个数,然后转移方程为:

dp[u][j]=min(dp[u][j] , dp[u][j-k]+dp[v][k]-1),v是u的子结点,k表示在v的子树中选k个结点,-1是因为选择了v那么u->v的边不用删了。

  最后的结果是min(dp[1][p],dp[i][p]+1) (i>=2),因为如果不为根节点,还要删除i与其父结点的边。

AC代码:

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4.  
  5. const int maxn=;
  6. const int inf=0x3f3f3f3f;
  7. int n,p,ans,cnt,head[maxn],son[maxn],num[maxn],dp[maxn][maxn];
  8.  
  9. struct node{
  10. int v,nex;
  11. }edge[maxn];
  12.  
  13. void adde(int u,int v){
  14. edge[++cnt].v=v;
  15. edge[cnt].nex=head[u];
  16. head[u]=cnt;
  17. }
  18.  
  19. void dfs(int u){
  20. son[u]=;
  21. dp[u][]=num[u];
  22. for(int i=head[u];i;i=edge[i].nex){
  23. int v=edge[i].v;
  24. dfs(v);
  25. son[u]+=son[v];
  26. for(int j=son[u];j>;--j)
  27. for(int k=;k<=min(j-,son[v]);++k)
  28. dp[u][j]=min(dp[u][j],dp[u][j-k]+dp[v][k]-);
  29. }
  30. }
  31.  
  32. int main(){
  33. while(~scanf("%d%d",&n,&p)){
  34. cnt=;
  35. for(int i=;i<=n;++i)
  36. head[i]=num[i]=;
  37. for(int i=;i<n;++i){
  38. int u,v;
  39. scanf("%d%d",&u,&v);
  40. adde(u,v);
  41. ++num[u];
  42. }
  43. for(int i=;i<=n;++i)
  44. for(int j=;j<=n;++j)
  45. dp[i][j]=inf;
  46. dfs();
  47. ans=dp[][p];
  48. for(int i=;i<=n;++i)
  49. if(son[i]>=p)
  50. ans=min(ans,dp[i][p]+);
  51. printf("%d\n",ans);
  52. }
  53. return ;
  54. }

poj1947(树上分组背包)的更多相关文章

  1. 【题解】洛谷P1273 有线电视网(树上分组背包)

    次元传送门:洛谷P1273 思路 一开始想的是普通树形DP 但是好像实现不大好 观摩了一下题解 是树上分组背包 设f[i][j]为以i为根的子树中取j个客户得到的总价值 我们可以以i为根有j组 在每一 ...

  2. 洛谷P1273 有线电视网 树上分组背包DP

    P1273 有线电视网 )逼着自己写DP 题意:在一棵树上选出最多的叶子节点,使得叶子节点的值 减去 各个叶子节点到根节点的消耗 >= 0: 思路: 树上分组背包DP,设dp[u][k] 表示 ...

  3. hdoj1011(树上分组背包)

    题目链接:https://vjudge.net/problem/HDU-1011 题意:给定一颗树,每个结点有两个属性,即花费V和价值w,并且选择子结点时必须选择父结点,求总花费不超过m的最大价值. ...

  4. poj1155 TELE (树上分组背包)

    题目链接:https://vjudge.net/problem/POJ-1155 题意:给定一颗以1为根的边权树,有n个结点,其中m个叶子结点,每个叶子结点有一个价值.要求从m个叶子结点中选最多的结点 ...

  5. 洛谷P1273 有线电视网 (树上分组背包)

    洛谷P1273 有线电视网 题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节 ...

  6. 洛谷 P1273 有线电视网 && caioj 1109 树形动态规划(TreeDP)4:比赛转播(树上分组背包总结)

    从这篇博客往前到二叉苹果树都可以用分组背包做 这依赖性的问题,都可以用于这道题类似的方法来做 表示以i为根的树中取j个节点所能得的最大价值 那么每一个子树可以看成一个组,每个组里面取一个节点,两个节点 ...

  7. 洛谷P1273 有线电视网 【树上分组背包】

    题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点. 从转播站到转播站以及从 ...

  8. HDU-1011 Starship Troopers (树形DP+分组背包)

    题目大意:给一棵有根带点权树,并且给出容量.求在不超过容量下的最大权值.前提是选完父节点才能选子节点. 题目分析:树上的分组背包. ps:特判m为0时的情况. 代码如下: # include<i ...

  9. 2018.12.14 codeforces 922E. Birds(分组背包)

    传送门 蒟蒻净做些水题还请大佬见谅 没错这又是个一眼的分组背包. 题意简述:有n棵树,每只树上有aia_iai​只鸟,第iii棵树买一只鸟要花cic_ici​的钱,每买一只鸟可以奖励bbb块钱,从一棵 ...

随机推荐

  1. mouseout([[data],fn])

    mouseout([[data],fn]) 概述 当鼠标指针从元素上移开时,发生 mouseout 事件. 该事件大多数时候会与 mouseover 事件一起使用.深圳dd马达 注释:与 mousel ...

  2. Flutter布局2--Align

    Align控件即对齐控件,能将子控件所指定方式对齐,并根据子控件的大小调整自己的大小. eg: 文字组件对齐于右下方 new Align( alignment: FractionalOffset.bo ...

  3. SessionState,默認mode應該是"InProc"

    在ASP.NET的sessionState的三種屬性 http://www.dotblogs.com.tw/boei/archive/2010/07/06/16414.aspx需要在另外的config ...

  4. DOS窗口启动tomact,运用startup.bat/shutdown.bat命令启动/关闭tomcat

    设置CATALINA_HOME环境变量1.CATALINA_HOME是TOMCAT安装路径的别名,目的是为了方便使用TOMCAT2.计算机>属性>环境变量, 新建环境变量.变量名为CATA ...

  5. IDEA工具的安装、破解与配置

    一.什么是IDEA? IDEA 全称 IntelliJ IDEA,是java编程语言开发的集成环境,是目前最好用的java集成开发工具.他最突出的功能是调试(Debug),可以对Java代码,Java ...

  6. hive安装常见错误

    hive编译出错 mvn clean package -DskipTests -Phadoop-2 -Pdist 失败日志1 Failed to execute goal on project hiv ...

  7. P1582 倒水,P2158 [SDOI2008]仪仗队——数学,二进制

    有n个瓶子,里面都有一升水,但是只想保留k个瓶子,只能两个瓶子里面的水体积相等时才能倒在一个瓶子里:不能丢弃有水的瓶子:瓶子容量无限: 问需要购买几个额外的瓶子才能满足条件: 因为每个瓶子一开始只有一 ...

  8. Contest Hunter 3101

    题目 Contest Hunter 3101 阶乘分解 原题传送门 题目分析 这里介绍一个本蒟蒻自己\(yy\)出来的方法. 我们发现,对于某一个单个的整数\(n\),若\(n\)能被某一个数\(x\ ...

  9. JAVA基础知识|lambda与stream

    lambda与stream是java8中比较重要两个新特性,lambda表达式采用一种简洁的语法定义代码块,允许我们将行为传递到函数中.之前我们想将行为传递到函数中,仅有的选择是使用匿名内部类,现在我 ...

  10. Python 上下文管理器模块--contextlib

    在 Python 处理文件的时候我们使用 with 关键词来进行文件的资源关闭,但是并不是只有文件操作才能使用 with 语句.今天就让我们一起学习 Python 中的上下文管理 contextlib ...