重建道路 树形DP
重建道路 树形DP
给一棵树,问最少断多少边使得这棵树树最终只有\(p\)个节点
设计dp状态\(f[u][i][j]\)表示节点\(u\),到第\(i\)个儿子,使\(j\)个节点分离,但是不分离\(u\)最少需要断的边数。类比背包,容易得到转移方程:
\]
再优化一维\(i\),状态变为\(f[u][j]\),此时必须倒序遍历\(j\)。
需要注意的是,最后答案并不是\(f[1][sz[1]-p]\),因为最后可能把节点1也删了,所以必须在每个满足子树节点数\(\ge p\)的节点处统计一下答案。
\]
其中注意\(f[1][sz[1]]=0\),因为不需要将树根与其父亲分离(它没父亲)
#include <cstdio>
#include <cstring>
#define MAXN 155
#define MIN(A,B) ((A)<(B)?(A):(B))
using namespace std;
int n,p,ans;
int head[MAXN],nxt[MAXN*2],vv[MAXN*2],tot;
inline void add_edge(int u, int v){
vv[++tot]=v;
nxt[tot]=head[u];
head[u]=tot;
}
int f[MAXN][MAXN],sz[MAXN];
void load(int u, int fa){
sz[u]=1;
f[u][0]=0;
for(int i=head[u];i;i=nxt[i]){
int v=vv[i];
if(v==fa) continue;
load(v, u);
sz[u]+=sz[v];
}
f[u][sz[u]]=1;
}
void dfs(int u, int fa){
for(int i=head[u];i;i=nxt[i]){
int v=vv[i];
if(v==fa) continue;
dfs(v, u);
for(int j=sz[u];j>=0;--j)
for(int k=0;k<=MIN(sz[v], j);++k){
f[u][j]=MIN(f[v][k]+f[u][j-k], f[u][j]);
}
}
if(sz[u]>=p) ans=MIN(f[u][sz[u]-p]+f[u][sz[u]], ans);
}
int main(){
scanf("%d %d", &n, &p);
for(int i=2;i<=n;++i){
int u,v;
scanf("%d %d", &u, &v);
add_edge(u, v);
add_edge(v, u);
}
memset(f, 0x3f, sizeof(f));
ans=0x3f3f3f3f;
load(1, 0);
f[1][sz[1]]=0;
dfs(1, 0);
printf("%d", ans);
return 0;
}
/*
f[u][i][j]=min{f[u][i-1][j-k]+f[v][n][k]}
*/
重建道路 树形DP的更多相关文章
- P1272 重建道路(树形dp)
P1272 重建道路 题目描述 一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场.由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟 ...
- 洛谷 P1272 重建道路(树形DP)
P1272 重建道路 题目描述 一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场.由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟 ...
- Luogu P1272 重建道路 树形DP
刚才瞅了半天自己当初写的,终于瞅出来了...QWQ 设f[i][j]表示以i为根的子树,包含j个节点所需砍掉的最小边数 那么可知f[u][1]=u的度: 方程:f[u][j]=min(f[u][j], ...
- bzoj2500幸福的道路 树形dp+单调队列
2500: 幸福的道路 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 434 Solved: 170[Submit][Status][Discuss ...
- 【bzoj2500】幸福的道路 树形dp+倍增RMQ+二分
原文地址:http://www.cnblogs.com/GXZlegend/p/6825389.html 题目描述 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一 ...
- (noip模拟二十一)【BZOJ2500】幸福的道路-树形DP+单调队列
Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图. ...
- [LUOGU1272] 重建道路 - 树形背包
题目描述 一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场.由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟一的.因此,牧场运输系 ...
- [BZOJ 2500]幸福的道路 树形dp+单调队列+二分答案
考试的时候打了个树链剖分,而且还审错题了,以为是每天找所有点的最长路,原来是每天起点的树上最长路径再搞事情.. 先用dfs处理出来每个节点以他为根的子树的最长链和次长链.(后面会用到) 然后用类似dp ...
- [HNOI2018]道路 --- 树形DP
[HNOI2018]道路 题目描述: W 国的交通呈一棵树的形状.W 国一共有 \(n-1\) 个城市和 \(n\) 个乡村, 其中城市从 \(1\) 到 \(n-1\) 编号,乡村从 \(1\) 到 ...
随机推荐
- 软件包 javax.naming了解
Context 此接口表示一个命名上下文,它由一组名称到对象的绑定组成. Name Name 接口表示一个一般名称,即一个有序的组件序列. NameParser 此接口用于解析取自分层的名称空间 ...
- ALV报表——点击事件(二)
目录 一.ALV点击事件(双击) 一.ALV点击事件(双击) 代码: *Report ZRFI001_XFL_TEST REPORT ZRFI001_XFL_TEST . *定义ALV所需要用到的类型 ...
- docker 宿主机与容器直接文件移动命令
1.将容器中的文件复制到宿主机 我们把容器中的 nginx 目录整个复制到 宿主机/usr/local/nginx 目录下,使用如下命令: docker cp nginx_test: /etc/ng ...
- 在Windows上安装 Consul
使用Chocolatey(Windows包管理工具)安装 官方安装说明 https://chocolatey.org/install 安装Consul 官方安装说明 https://chocolate ...
- 微信小程序开发demo
自己写的小程序,欢迎下载 https://gitee.com/lijunchengit/chengZiShengHuoBang
- win10 下的 CUDA10.0 +CUDNN + tensorflow + opencv 环境部署
1 CUDA 10.0 安装 win10 下的cuda 安装是非常简单的,和其他程序安装没什么区别,现在 tensorflow 1.13 版本以上 支持 CUDA 10.0 ,这里选取了CUDA 1 ...
- 【Linux】修改CentOS7启动方式
## 查看当前系统的默认启动方式: systemctl get-default ## 查看如下文件 cat /etc/inittab 可以看到 此文件中提示了如何进行修改默认的启动方式 ## 命令行启 ...
- 【nodejs代理服务器三】nodejs注册windows服务
node-windows I no longer have enough time to properly maintain this project and am seeking a new pri ...
- Android笔记(七) Android中的布局——线性布局
我们的软件是由好多个界面组成的,而每个界面又由N多个控件组成,Android中借助布局来让各个空间有条不紊的摆放在界面上. 可以把布局看作是一个可以放置很多控件的容器,它可以按照一定的规律调整控件的位 ...
- vue-quill-editor + iview 实现富文本编辑器及图片上传
1.npm 安装 vue-quill-editor npm install vue-quill-editor 2.再main.js中引入 import VueQuillEditor from 'vue ...