P1272 重建道路
题目描述
一场可怕的地震后,人们用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-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需要连通,所以需要少减一个哦
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- #define inf 2147483647
- const ll INF = 0x3f3f3f3f3f3f3f3fll;
- #define ri register int
- template <class T> inline T min(T a, T b, T c)
- {
- return min(min(a, b), c);
- }
- template <class T> inline T max(T a, T b, T c)
- {
- return max(max(a, b), c);
- }
- template <class T> inline T min(T a, T b, T c, T d)
- {
- return min(min(a, b), min(c, d));
- }
- template <class T> inline T max(T a, T b, T c, T d)
- {
- return max(max(a, b), max(c, d));
- }
- #define pi acos(-1)
- #define me(x, y) memset(x, y, sizeof(x));
- #define For(i, a, b) for (int i = a; i <= b; i++)
- #define FFor(i, a, b) for (int i = a; i >= b; i--)
- #define mp make_pair
- #define pb push_back
- const int maxn = ;
- #define mod 100003
- const int N=;
- // name*******************************
- int Head[N];
- int tot=;
- struct edge
- {
- int to,next;
- } e[N];
- int n,m;
- int f[N][N];
- int a,b;
- int du[N];
- int ans;
- // function******************************
- void add(int u,int v)
- {
- e[++tot].to=v;
- e[tot].next=Head[u];
- Head[u]=tot;
- }
- int dfs(int u)
- {
- int cnt=;
- for(int p=Head[u]; p; p=e[p].next)
- {
- int v=e[p].to;
- int t=dfs(v);
- cnt+=t;
- FFor(j,min(m,cnt),)
- {
- FFor(k,min(j-,t),)
- {
- f[u][j]=min(f[u][j],f[u][j-k]+f[v][k]-);
- // cout<<u<<","<<v<<","<<j<<":"<<f[u][j]<<endl;
- }
- }
- }
- return cnt;
- }
- //***************************************
- int main()
- {
- // freopen("test.txt", "r", stdin);
- cin>>n>>m;
- me(f,);
- For(i,,n-)
- {
- cin>>a>>b;
- add(a,b);
- du[a]++;
- }
- For(i,,n)
- f[i][]=du[i];
- dfs();
- ans=f[][m]; //注意这里总根不需要+1!!!
- For(i,,n)
- {
- ans=min(ans,f[i][m]+); //其他节点因为有父亲,需要切断联系,所以+1,
- }
- cout<<ans;
- return ;
- }
P1272 重建道路的更多相关文章
- 洛谷 P1272 重建道路 解题报告
P1272 重建道路 题目描述 一场可怕的地震后,人们用\(N\)个牲口棚\((1≤N≤150\),编号\(1..N\))重建了农夫\(John\)的牧场.由于人们没有时间建设多余的道路,所以现在从一 ...
- P1272 重建道路(树形dp)
P1272 重建道路 题目描述 一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场.由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟 ...
- 洛谷 P1272 重建道路(树形DP)
P1272 重建道路 题目描述 一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场.由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟 ...
- [洛谷P1272] 重建道路
类型:树形背包 传送门:>Here< 题意:给出一棵树,要求断开$k$条边来分离出一棵有$P$个节点的子树.求最小的$k$ 解题思路 和上一题类型相同,但不那么好做了——分离出的一棵子树肯 ...
- luogu P1272 重建道路
嘟嘟嘟 这好像是一种树上背包. 我们令dp[i][j] 表示在 i 所在的子树中(包括节点 i)分离出一个大小为 j 的子树最少需割多少条边. 那么转移方程就是 dp[u][j] = min(dp[u ...
- 洛谷 P1272 重建道路
题目链接 题解 树形dp \(f_{i, j}\)表示以\(i\)为根的子树切出联通块大小为\(j\)的最小答案 显然\(f[i][1]\)为与\(i\)连的边数 设\(v\)是\(u\)的儿子 那么 ...
- Luogu P1272 重建道路 树形DP
刚才瞅了半天自己当初写的,终于瞅出来了...QWQ 设f[i][j]表示以i为根的子树,包含j个节点所需砍掉的最小边数 那么可知f[u][1]=u的度: 方程:f[u][j]=min(f[u][j], ...
- 【洛谷P1272】 重建道路
重建道路 题目链接 一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场.由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟一的.因此, ...
- 【Luogu1272】重建道路(动态规划)
[Luogu1272]重建道路(动态规划) 题面 题目描述 一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场.由于人们没有时间建设多余的道路,所以现在从一个牲 ...
随机推荐
- JS 词法作用域 p2
关于js 还是写的简短些,利于个人理解: 先看一个例子: var a = 2; function fn(){ var a = 3; console.log(a); } fn(a); 说明:作用域查找会 ...
- webstorm激活
选择 License server http://idea.imsxm.com/ http://idea.iteblog.com/key.php (2016.11.16) http://v2mc.ne ...
- 微信小程序获取当前地址以及选择地址详解 地点标记
首先定义事件: bindtap='getLocation' <view class='store-bot' bindtap='getLocation'> <view class='c ...
- 百度自动推送js
<!DOCTYPE html> <!-- saved from url=(0014)about:internet --> <html> <head> & ...
- input框中自动展示当前日期 yyyy/mm/dd
直接上代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...
- FineReport8.0如何连接FineIndex取数分析
1. 描述 在3.7及之前版本,FineReport连接都是通过安装多维数据集插件,然后通过多维数据库的方式连接FineBI(3.4-3.6对应711,3.7对应8.0),从4.0版本开始,FineR ...
- Python+Selenium笔记(十二):数据驱动测试
(一) 前言 通过使用数据驱动测试,实现对输入值和预期结果的参数化.(例如:输入数据和预期结果可以直接读取Excel文档的数据) (二) ddt 使用ddt执行数据驱动测试,ddt库可以将测试 ...
- LeetCode题解之Contains Duplicate II
1.题目描述 2.题目分析 使用哈希表 和分情况讨论的方法 3.代码 bool containsNearbyDuplicate(vector<int>& nums, int k) ...
- Java 注解用法详解——@SuppressWarnings
转自: https://www.cnblogs.com/fsjohnhuang/p/4040785.html Java魔法堂:注解用法详解——@SuppressWarnings 一.前言 编码时我 ...
- 清空数据库错误:因为该表正由 FOREIGN KEY 约束引用 解决办法
如下解决了五个问题 1. 清空数据 2. 有外键也可以, 因为是逆向删除, 从最后一张表删除. 且使用的是delete, 因为truncate不能对有外键的表 3. 种子问题, 如果表存在种子重设为0 ...