思路:dp[i][j]表示,以i节点为根,删去j个节点最少要断几条边。

那么dp[u][j]=min(dp[u][j],dp[v][k]+dp[u][j-k]);//选取最优状态

dp[u][j]=min(dp[u][j],dp[u][j-son[v]]+1);//切断与子节点相连的边

对于子节点

dp[v][n-son[v]]=1;

dp[v][j]=min(dp[v][j],dp[v][j-n+son[v]]+1)//表示不需要由父节点过来的那条分支

最有从所有状态中选举最优的dp[i][n-p];

  1. #include<map>
  2. #include<set>
  3. #include<cmath>
  4. #include<queue>
  5. #include<cstdio>
  6. #include<vector>
  7. #include<string>
  8. #include<cstdlib>
  9. #include<cstring>
  10. #include<iostream>
  11. #include<algorithm>
  12. #define Maxn 160
  13. #define Maxm 200010
  14. #define LL __int64
  15. #define Abs(x) ((x)>0?(x):(-x))
  16. #define lson(x) (x<<1)
  17. #define rson(x) (x<<1|1)
  18. #define inf 0x7fffffff
  19. #define Mod 1000000007
  20. using namespace std;
  21. int head[Maxn],vi[Maxn],e,dp[][],n,p,son[],root[Maxn];
  22. struct Edge{
  23. int u,v,next;
  24. }edge[Maxm];
  25. void init()
  26. {
  27. memset(head,-,sizeof(head));
  28. memset(vi,,sizeof(vi));
  29. memset(son,,sizeof(son));
  30. for(int i=;i<=;i++){
  31. root[i]=i;
  32. for(int j=;j<=;j++){
  33. dp[i][j]=;
  34. }
  35. dp[i][]=;
  36. }
  37. e=;
  38. }
  39. void add(int u,int v)
  40. {
  41. edge[e].u=u,edge[e].v=v,edge[e].next=head[u],head[u]=e++;
  42. edge[e].u=v,edge[e].v=u,edge[e].next=head[v],head[v]=e++;
  43. }
  44. void dfs(int u)
  45. {
  46. int i,v,j,k;
  47. vi[u]=;
  48. son[u]=;
  49. for(i=head[u];i!=-;i=edge[i].next){
  50. v=edge[i].v;
  51. if(vi[v]) continue;
  52. dfs(v);
  53. son[u]+=son[v];
  54. for(j=n-;j>=;j--){
  55. for(k=;k<=j;k++){
  56. dp[u][j]=min(dp[u][j],dp[u][j-k]+dp[v][k]);
  57. }
  58. if(j>=son[v])
  59. dp[u][j]=min(dp[u][j],dp[u][j-son[v]]+);
  60. }
  61. dp[v][n-son[v]]=;
  62. for(j=n-;j>=n-son[v];j--)
  63. dp[v][j]=min(dp[v][j],dp[v][j-n+son[v]]+);
  64. }
  65. }
  66. int main()
  67. {
  68. int i,j,u,v;
  69. while(scanf("%d%d",&n,&p)!=EOF){
  70. init();
  71. for(i=;i<n;i++){
  72. scanf("%d%d",&u,&v);
  73. add(u,v);
  74. }
  75. if(p==n){
  76. printf("0\n");
  77. continue;
  78. }
  79. if(p==n-)
  80. {
  81. printf("1\n");
  82. continue;
  83. }
  84. dfs();
  85. int ans=;
  86. for(i=;i<=n;i++){
  87. ans=min(ans,dp[i][n-p]);
  88. }
  89. printf("%d\n",ans);
  90. }
  91. return ;
  92. }

poj 1947 树形dp的更多相关文章

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

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

  2. Fire (poj 2152 树形dp)

    Fire (poj 2152 树形dp) 给定一棵n个结点的树(1<n<=1000).现在要选择某些点,使得整棵树都被覆盖到.当选择第i个点的时候,可以覆盖和它距离在d[i]之内的结点,同 ...

  3. poj 1463(树形dp)

    题目链接:http://poj.org/problem?id=1463 思路:简单树形dp,如果不选父亲节点,则他的所有的儿子节点都必须选,如果选择了父亲节点,则儿子节点可选,可不选,取较小者. #i ...

  4. poj 2486( 树形dp)

    题目链接:http://poj.org/problem?id=2486 思路:经典的树形dp,想了好久的状态转移.dp[i][j][0]表示从i出发走了j步最后没有回到i,dp[i][j][1]表示从 ...

  5. poj 3140(树形dp)

    题目链接:http://poj.org/problem?id=3140 思路:简单树形dp题,dp[u]表示以u为根的子树的人数和. #include<iostream> #include ...

  6. Strategic game(POJ 1463 树形DP)

    Strategic game Time Limit: 2000MS   Memory Limit: 10000K Total Submissions: 7490   Accepted: 3483 De ...

  7. POJ 2342 树形DP入门题

    有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...

  8. poj 3345 树形DP 附属关系+输入输出(好题)

    题目连接:http://acm.hust.edu.cn/vjudge/problem/17665 参考资料:http://blog.csdn.net/woshi250hua/article/detai ...

  9. POJ 1155 树形DP

    题意:电视台发送信号给很多用户,每个用户有愿意出的钱,电视台经过的路线都有一定费用,求电视台不损失的情况下最多给多少用户发送信号. 转自:http://www.cnblogs.com/andre050 ...

随机推荐

  1. 用java写一个web服务器

    一.超文本传输协议 Web服务器和浏览器通过HTTP协议在Internet上发送和接收消息.HTTP协议是一种请求-应答式的协议——客户端发送一个请求,服务器返回该请求的应答.HTTP协议使用可靠的T ...

  2. Delphi Interfaces

    http://www.delphibasics.co.uk/Article.asp?Name=Interface The reason for interfaces   Classes that ex ...

  3. Architecture of Device I/O Drivers, Device Driver Design

    http://www.kalinskyassociates.com/Wpaper4.html Architecture of Device I/O Drivers Many embedded syst ...

  4. 不要滥用div,保持代码的整洁

    这篇文章算是很基础的了.旨在介绍如何保证页面代码的整洁.以维护性.使用有语义的页面标签,减少标签的滥用. 1. 移除不必要的<div>标签 嵌套在<form><ul> ...

  5. 广州项目实施步骤I_练习安装 CentOS x64 6.4

    安装Centos x64 6.4 在家里使用 Vmware10.0.1进行模拟安装. 永久KEY注册密钥:5F29M-48312-8ZDF9-A8A5K-2AM0Z  下载地址:http://pan. ...

  6. 用java发送邮件(黄海已测试通过)

    /** * java发送带附件的邮件 * 周枫 * 2013.8.10 */ package com.dsideal.Util; import javax.mail.*; import javax.m ...

  7. JavaScript的角色巨变和Web技术的发展

    曾经JavaScript是职业程序员看不上眼的脚本语言,如今只有高级程序员才能驾驭它. JavaScript性质和地位的天翻地覆,正是Web技术飞速变化的印证. 最初职业程序员轻视JavaScript ...

  8. Entity Framework 6 Code First +MVC5+MySql/Oracle使用过程中的几个问题

    1. namespace Snapsia.Web.Models { using System; using System.Data.Entity; using System.ComponentMode ...

  9. Codeforces Gym 100803G Flipping Parentheses 线段树+二分

    Flipping Parentheses 题目连接: http://codeforces.com/gym/100803/attachments Description A string consist ...

  10. Codeforces Round #180 (Div. 2) D. Fish Weight 贪心

    D. Fish Weight 题目连接: http://www.codeforces.com/contest/298/problem/D Description It is known that th ...