题目描述

一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场。由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟一的。因此,牧场运输系统可以被构建成一棵树。John想要知道另一次地震会造成多严重的破坏。有些道路一旦被毁坏,就会使一棵含有P(1≤P≤N)个牲口棚的子树和剩余的牲口棚分离,John想知道这些道路的最小数目。

输入输出格式

输入格式:

第1行:2个整数,N和P

第2..N行:每行2个整数I和J,表示节点I是节点J的父节点。

输出格式:

单独一行,包含一旦被破坏将分离出恰含P个节点的子树的道路的最小数目。

输入输出样例

输入样例#1: 复制

  1. 11 6
  2. 1 2
  3. 1 3
  4. 1 4
  5. 1 5
  6. 2 6
  7. 2 7
  8. 2 8
  9. 4 9
  10. 4 10
  11. 4 11
输出样例#1: 复制

  1. 2

说明

【样例解释】

如果道路1-4和1-5被破坏,含有节点(1,2,3,6,7,8)的子树将被分离出来

f(u,j):以u为节点的子树,保留j个节点(必须包含u),需要切断的最小道路数目(不考虑u的父亲!!有些题解考虑u父亲做的)

f[u][j]=min(f[u][j],f[u][j-k]+f[v][k]-1);

因为u与v需要连通,所以需要少减一个哦

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. #define inf 2147483647
  5. const ll INF = 0x3f3f3f3f3f3f3f3fll;
  6. #define ri register int
  7. template <class T> inline T min(T a, T b, T c)
  8. {
  9. return min(min(a, b), c);
  10. }
  11. template <class T> inline T max(T a, T b, T c)
  12. {
  13. return max(max(a, b), c);
  14. }
  15. template <class T> inline T min(T a, T b, T c, T d)
  16. {
  17. return min(min(a, b), min(c, d));
  18. }
  19. template <class T> inline T max(T a, T b, T c, T d)
  20. {
  21. return max(max(a, b), max(c, d));
  22. }
  23. #define pi acos(-1)
  24. #define me(x, y) memset(x, y, sizeof(x));
  25. #define For(i, a, b) for (int i = a; i <= b; i++)
  26. #define FFor(i, a, b) for (int i = a; i >= b; i--)
  27. #define mp make_pair
  28. #define pb push_back
  29. const int maxn = ;
  30. #define mod 100003
  31. const int N=;
  32.  
  33. // name*******************************
  34. int Head[N];
  35. int tot=;
  36. struct edge
  37. {
  38. int to,next;
  39. } e[N];
  40. int n,m;
  41. int f[N][N];
  42. int a,b;
  43. int du[N];
  44. int ans;
  45. // function******************************
  46. void add(int u,int v)
  47. {
  48. e[++tot].to=v;
  49. e[tot].next=Head[u];
  50. Head[u]=tot;
  51. }
  52.  
  53. int dfs(int u)
  54. {
  55. int cnt=;
  56. for(int p=Head[u]; p; p=e[p].next)
  57. {
  58. int v=e[p].to;
  59. int t=dfs(v);
  60. cnt+=t;
  61. FFor(j,min(m,cnt),)
  62. {
  63. FFor(k,min(j-,t),)
  64. {
  65. f[u][j]=min(f[u][j],f[u][j-k]+f[v][k]-);
  66. // cout<<u<<","<<v<<","<<j<<":"<<f[u][j]<<endl;
  67. }
  68. }
  69. }
  70. return cnt;
  71. }
  72.  
  73. //***************************************
  74. int main()
  75. {
  76. // freopen("test.txt", "r", stdin);
  77. cin>>n>>m;
  78. me(f,);
  79. For(i,,n-)
  80. {
  81. cin>>a>>b;
  82. add(a,b);
  83. du[a]++;
  84. }
  85. For(i,,n)
  86. f[i][]=du[i];
  87. dfs();
  88. ans=f[][m]; //注意这里总根不需要+1!!!
  89. For(i,,n)
  90. {
  91. ans=min(ans,f[i][m]+); //其他节点因为有父亲,需要切断联系,所以+1,
  92. }
  93. cout<<ans;
  94. return ;
  95. }

P1272 重建道路的更多相关文章

  1. 洛谷 P1272 重建道路 解题报告

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

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

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

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

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

  4. [洛谷P1272] 重建道路

    类型:树形背包 传送门:>Here< 题意:给出一棵树,要求断开$k$条边来分离出一棵有$P$个节点的子树.求最小的$k$ 解题思路 和上一题类型相同,但不那么好做了——分离出的一棵子树肯 ...

  5. luogu P1272 重建道路

    嘟嘟嘟 这好像是一种树上背包. 我们令dp[i][j] 表示在 i 所在的子树中(包括节点 i)分离出一个大小为 j 的子树最少需割多少条边. 那么转移方程就是 dp[u][j] = min(dp[u ...

  6. 洛谷 P1272 重建道路

    题目链接 题解 树形dp \(f_{i, j}\)表示以\(i\)为根的子树切出联通块大小为\(j\)的最小答案 显然\(f[i][1]\)为与\(i\)连的边数 设\(v\)是\(u\)的儿子 那么 ...

  7. Luogu P1272 重建道路 树形DP

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

  8. 【洛谷P1272】 重建道路

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

  9. 【Luogu1272】重建道路(动态规划)

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

随机推荐

  1. JS 词法作用域 p2

    关于js 还是写的简短些,利于个人理解: 先看一个例子: var a = 2; function fn(){ var a = 3; console.log(a); } fn(a); 说明:作用域查找会 ...

  2. webstorm激活

    选择 License server http://idea.imsxm.com/ http://idea.iteblog.com/key.php (2016.11.16) http://v2mc.ne ...

  3. 微信小程序获取当前地址以及选择地址详解 地点标记

    首先定义事件: bindtap='getLocation' <view class='store-bot' bindtap='getLocation'> <view class='c ...

  4. 百度自动推送js

    <!DOCTYPE html> <!-- saved from url=(0014)about:internet --> <html> <head> & ...

  5. input框中自动展示当前日期 yyyy/mm/dd

    直接上代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...

  6. FineReport8.0如何连接FineIndex取数分析

    1. 描述 在3.7及之前版本,FineReport连接都是通过安装多维数据集插件,然后通过多维数据库的方式连接FineBI(3.4-3.6对应711,3.7对应8.0),从4.0版本开始,FineR ...

  7. Python+Selenium笔记(十二):数据驱动测试

    (一)   前言 通过使用数据驱动测试,实现对输入值和预期结果的参数化.(例如:输入数据和预期结果可以直接读取Excel文档的数据) (二)   ddt 使用ddt执行数据驱动测试,ddt库可以将测试 ...

  8. LeetCode题解之Contains Duplicate II

    1.题目描述 2.题目分析 使用哈希表 和分情况讨论的方法 3.代码 bool containsNearbyDuplicate(vector<int>& nums, int k) ...

  9. Java 注解用法详解——@SuppressWarnings

    转自: https://www.cnblogs.com/fsjohnhuang/p/4040785.html Java魔法堂:注解用法详解——@SuppressWarnings   一.前言 编码时我 ...

  10. 清空数据库错误:因为该表正由 FOREIGN KEY 约束引用 解决办法

    如下解决了五个问题 1. 清空数据 2. 有外键也可以, 因为是逆向删除, 从最后一张表删除. 且使用的是delete, 因为truncate不能对有外键的表 3. 种子问题, 如果表存在种子重设为0 ...