重建道路 树形DP

给一棵树,问最少断多少边使得这棵树树最终只有\(p​\)个节点

设计dp状态\(f[u][i][j]\)表示节点\(u\),到第\(i\)个儿子,使\(j\)个节点分离,但是不分离\(u\)最少需要断的边数。类比背包,容易得到转移方程:

\[f[u][i][j]=min{f[u][i-1][j-k]+f[v][n][k]}
\]

再优化一维\(i\),状态变为\(f[u][j]\),此时必须倒序遍历\(j\)。

需要注意的是,最后答案并不是\(f[1][sz[1]-p]\),因为最后可能把节点1也删了,所以必须在每个满足子树节点数\(\ge p\)的节点处统计一下答案。

\[ans=min(f[u][sz[u]-p]+f[u][sz[u]], ans)
\]

其中注意\(f[1][sz[1]]=0\),因为不需要将树根与其父亲分离(它没父亲)

  1. #include <cstdio>
  2. #include <cstring>
  3. #define MAXN 155
  4. #define MIN(A,B) ((A)<(B)?(A):(B))
  5. using namespace std;
  6. int n,p,ans;
  7. int head[MAXN],nxt[MAXN*2],vv[MAXN*2],tot;
  8. inline void add_edge(int u, int v){
  9. vv[++tot]=v;
  10. nxt[tot]=head[u];
  11. head[u]=tot;
  12. }
  13. int f[MAXN][MAXN],sz[MAXN];
  14. void load(int u, int fa){
  15. sz[u]=1;
  16. f[u][0]=0;
  17. for(int i=head[u];i;i=nxt[i]){
  18. int v=vv[i];
  19. if(v==fa) continue;
  20. load(v, u);
  21. sz[u]+=sz[v];
  22. }
  23. f[u][sz[u]]=1;
  24. }
  25. void dfs(int u, int fa){
  26. for(int i=head[u];i;i=nxt[i]){
  27. int v=vv[i];
  28. if(v==fa) continue;
  29. dfs(v, u);
  30. for(int j=sz[u];j>=0;--j)
  31. for(int k=0;k<=MIN(sz[v], j);++k){
  32. f[u][j]=MIN(f[v][k]+f[u][j-k], f[u][j]);
  33. }
  34. }
  35. if(sz[u]>=p) ans=MIN(f[u][sz[u]-p]+f[u][sz[u]], ans);
  36. }
  37. int main(){
  38. scanf("%d %d", &n, &p);
  39. for(int i=2;i<=n;++i){
  40. int u,v;
  41. scanf("%d %d", &u, &v);
  42. add_edge(u, v);
  43. add_edge(v, u);
  44. }
  45. memset(f, 0x3f, sizeof(f));
  46. ans=0x3f3f3f3f;
  47. load(1, 0);
  48. f[1][sz[1]]=0;
  49. dfs(1, 0);
  50. printf("%d", ans);
  51. return 0;
  52. }
  53. /*
  54. f[u][i][j]=min{f[u][i-1][j-k]+f[v][n][k]}
  55. */

重建道路 树形DP的更多相关文章

  1. P1272 重建道路(树形dp)

    P1272 重建道路 题目描述 一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场.由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟 ...

  2. 洛谷 P1272 重建道路(树形DP)

    P1272 重建道路 题目描述 一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场.由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟 ...

  3. Luogu P1272 重建道路 树形DP

    刚才瞅了半天自己当初写的,终于瞅出来了...QWQ 设f[i][j]表示以i为根的子树,包含j个节点所需砍掉的最小边数 那么可知f[u][1]=u的度: 方程:f[u][j]=min(f[u][j], ...

  4. bzoj2500幸福的道路 树形dp+单调队列

    2500: 幸福的道路 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 434  Solved: 170[Submit][Status][Discuss ...

  5. 【bzoj2500】幸福的道路 树形dp+倍增RMQ+二分

    原文地址:http://www.cnblogs.com/GXZlegend/p/6825389.html 题目描述 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一 ...

  6. (noip模拟二十一)【BZOJ2500】幸福的道路-树形DP+单调队列

    Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图. ...

  7. [LUOGU1272] 重建道路 - 树形背包

    题目描述 一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场.由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟一的.因此,牧场运输系 ...

  8. [BZOJ 2500]幸福的道路 树形dp+单调队列+二分答案

    考试的时候打了个树链剖分,而且还审错题了,以为是每天找所有点的最长路,原来是每天起点的树上最长路径再搞事情.. 先用dfs处理出来每个节点以他为根的子树的最长链和次长链.(后面会用到) 然后用类似dp ...

  9. [HNOI2018]道路 --- 树形DP

    [HNOI2018]道路 题目描述: W 国的交通呈一棵树的形状.W 国一共有 \(n-1\) 个城市和 \(n\) 个乡村, 其中城市从 \(1\) 到 \(n-1\) 编号,乡村从 \(1\) 到 ...

随机推荐

  1. HTML5 Notification

    H5的Notification特性 Web桌面通知 Notification API的通知接口用于向用户配置和显示桌面通知. 生产环境仅支持https下使用:否则会被默认禁止.开发环境可以在local ...

  2. 【hash】Power Strings

    [题意]: 给出s串出来,能否找到一个前缀 ,通过多次前缀进行拼接.构成s串.如果有多个,请输出最多次数那个. 如:aaaa 可以用1个a,进行4次拼接 可以用2个a,进行2次拼接 可以用4个a,进行 ...

  3. 百人研发团队的难题:研发管理、绩效考核、组织文化和OKR

    分享一个公司规模近200,研发占一半的创业公司 Worktile 在研发团队管理方面的玩法,仅供百人左右研发团队参考~ 什么是研发团队?简单的说,你熟悉的那帮穿格子衬衫,以程序员为核心组成的团队,就是 ...

  4. 怎样安装ipython

    ipython 是一个python的交互式shell, 比默认的python shell更好用, 支持自动补全 / 上下翻等功能.  下面是按照方法: # 通用安装方法 pip install ipy ...

  5. 在论坛中出现的比较难的sql问题:34(递归 获取连续值问题)

    原文:在论坛中出现的比较难的sql问题:34(递归 获取连续值问题) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  6. [LeetCode] 342. 4的幂 ☆(是否4 的幂)

    描述 给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方. 示例 1: 输入: 16输出: true示例 2: 输入: 5输出: false 进阶:你能不使用循环或者递归 ...

  7. spice在桌面虚拟化中的应用系列之三(USB映射实现,SSL加密,密码认证,多客户端支持)

    本系列其它文章 spice在桌面虚拟化中的应用系列之一(spice简介,性能优化等) spice在桌面虚拟化中的应用系列之二(Linux平台spice客户端的编译安装,支持USB映射) 1.spice ...

  8. WMware Workstation——网络类型:NAT、bridge、host-only

    bridge NAT host-only 总结: NAT和host-only都需要虚拟网卡(WMware Adapter Card)实现物理机和虚拟机互访. NAT和bridge都可以访问外网 NAT ...

  9. 版本控制系统(VCS)简介

    简介 版本控制系统(VCS)是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统.使用版本控制系统通常还意味着,就算你乱来一气把整个项目中的文件改的改删的删,你也照样可以轻松恢复到原先 ...

  10. 越狱后cydia无法联网

    0x:卸载 cydia installer 1x:卸载后重启手机 2x:再次h3lix