算法

dp[i][j]表示以i为根的子树要变成有j个节点的状态需要减掉的边数。

考虑状态转移的时候不考虑i的父亲节点,就当不存在。最后统计最少减去边数的

时候+1。

考虑一个节点时,有两种选择,要么剪掉跟子节点相连的边,则dp[i][j] = dp[i][j]+1;

要么不剪掉,则d[i][j] = max(dp[i][j], dp[i][k]+dp[son][j-k]);

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<vector>
  5. using namespace std;
  6. vector<int> v[160];
  7. int dp[160][160],fa[160],p,n;
  8. int minn(int a,int b)
  9. {
  10. return a<b?a:b;
  11. }
  12. void dfs(int r,int pre)
  13. {
  14. int s = v[r].size();
  15. dp[r][1]=0;
  16. for(int k=0;k<s;k++)
  17. {
  18. int to=v[r][k];
  19. if(to==pre) continue;
  20. dfs(to,r);
  21. for(int i=p;i>=0;i--)
  22. {
  23. int tmp=dp[r][i]+1;
  24. for(int j=1;j<i;j++)
  25. tmp=minn(tmp,dp[r][j]+dp[to][i-j]);
  26. dp[r][i]=tmp;
  27. }
  28. }
  29. }
  30. int main()
  31. {
  32. int a,b,root;
  33. while(scanf("%d%d",&n,&p)!=EOF)
  34. {
  35. memset(dp,0x3f,sizeof(dp));
  36. memset(fa,0,sizeof(fa));
  37. for(int i=0;i<n-1;i++)
  38. {
  39. scanf("%d%d",&a,&b);
  40. v[a].push_back(b);
  41. fa[b]=a;
  42. }
  43. for(int i=1;i<=n;i++)
  44. {
  45. if(!fa[i])
  46. {
  47. root=i;
  48. break;
  49. }
  50. }
  51. dfs(root,-1);
  52. int ans=dp[root][p];
  53. for(int i=1;i<=n;i++)
  54. ans=minn(dp[i][p]+1,ans);
  55. printf("%d\n",ans);
  56. }
  57. return 0;
  58. }

DP Intro - poj 1947 Rebuilding Roads的更多相关文章

  1. DP Intro - poj 1947 Rebuilding Roads(树形DP)

    版权声明:本文为博主原创文章,未经博主允许不得转载. Rebuilding Roads Time Limit: 1000MS   Memory Limit: 30000K Total Submissi ...

  2. 树形dp(poj 1947 Rebuilding Roads )

    题意: 有n个点组成一棵树,问至少要删除多少条边才能获得一棵有p个结点的子树? 思路: 设dp[i][k]为以i为根,生成节点数为k的子树,所需剪掉的边数. dp[i][1] = total(i.so ...

  3. POJ 1947 Rebuilding Roads 树形DP

    Rebuilding Roads   Description The cows have reconstructed Farmer John's farm, with its N barns (1 & ...

  4. POJ 1947 Rebuilding Roads 树形dp 难度:2

    Rebuilding Roads Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 9105   Accepted: 4122 ...

  5. [poj 1947] Rebuilding Roads 树形DP

    Rebuilding Roads Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 10653 Accepted: 4884 Des ...

  6. POJ 1947 Rebuilding Roads

    树形DP..... Rebuilding Roads Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 8188 Accepted: ...

  7. POJ 1947 Rebuilding Roads (树dp + 背包思想)

    题目链接:http://poj.org/problem?id=1947 一共有n个节点,要求减去最少的边,行号剩下p个节点.问你去掉的最少边数. dp[u][j]表示u为子树根,且得到j个节点最少减去 ...

  8. POJ 1947 Rebuilding Roads(树形DP)

    题目链接 题意 : 给你一棵树,问你至少断掉几条边能够得到有p个点的子树. 思路 : dp[i][j]代表的是以i为根的子树有j个节点.dp[u][i] = dp[u][j]+dp[son][i-j] ...

  9. POJ 1947 - Rebuilding Roads 树型DP(泛化背包转移)..

    dp[x][y]表示以x为根的子树要变成有y个点..最少需要减去的边树... 最终ans=max(dp[i][P]+t)  < i=(1,n) , t = i是否为整棵树的根 > 更新的时 ...

随机推荐

  1. 使用VM克隆CentOS后,更改网络配置

    在使用VM克隆之后,遇到一件非常郁闷的事,就算我使用‘setup’命令,修改了我的网络配置,依然无法查询到我配置的网卡,也无法开启网卡. 经过百度等一系列手段,总结如下套路--PS:朋友称之为“破釜沉 ...

  2. 编写高质量代码改善C#程序的157个建议——建议128:考虑让派生类的名字以基类名字作为后缀

    建议128:考虑让派生类的名字以基类名字作为后缀 派生类的名字可以考虑以基类名字作为后缀.这带来的好处是,从类型的名字上我们就知道它包含在哪一个继承体系中. Exception及其子类就是这样一个典型 ...

  3. 关于搜索elasticsearch的数据条数大于10000的坑 max_result_window的两种设置方式

    当用elasticsearch进行深度分页查询时的size-from大于10000的时候,就会报错“”, 官方推荐是scroll查询返回结果是无序的不满足业务需求,所以还是通过设置最大返回结果数来达到 ...

  4. JAVA并发设计模式学习笔记(二)—— Single Threaded Execution Pattern

    注:本文的主要参考资料为结城浩所著<JAVA多线程设计模式>. 单线程执行模式(Single Threaded Execution Pattern)是最简单的多线程设计模式,几乎所有其他的 ...

  5. PreTranslateMessage()函数捕获键盘按键消息

    01. PreTranslateMessage函数,常用于屏蔽MFC对话框中默认的Enter和ESC消息 函数原型:BOOL PreTranslateMessage(MSG* pMsg) 用法举例: ...

  6. LDAP 相关链接

    http://www.cnblogs.com/fish-li/archive/2012/05/07/2486840.html细说ASP.NET Windows身份认证 http://www.cnblo ...

  7. DEV 之 有些控件不允许拖动。

    DEV 之 有些控件不允许拖动.  设置一个参数即可解决问题

  8. centos6和7的防火墙开关

    CentOS6.5查看防火墙的状态: 1 [linuxidc@localhost ~]$service iptable status 显示结果: 1 2 3 4 5 [linuxidc@localho ...

  9. scrapy-redis3

    原文链接:scrapy-redis使用以及剖析

  10. go iris xorm包使用(sqlite3数据库增删查改)

    官网https://studyiris.com/example/orm/xorm.html例子,稍做修改 1.我是win64,但没有遇到mingw问题,应该是之前安装过gcc环境,参考:测试一下rob ...