题目

给出一个大小为 \(n\) 的树,

问至少断掉多少条边使得存在一个大小为 \(m\) 的连通块

\(n\leq 150\)


分析

设 \(dp[x][s]\) 表示以 \(x\) 为根的子树至少断掉多少条边使得存在一个大小为 \(s\) 的连通块

则 \(dp[x][s]=\min\{dp[x][s']+dp[y][s-s']\}\)

如果不选该子树则要多断一条边,最后就是

\(\min\{dp[x][m]+[x>1]\}\)


代码

#include <cstdio>
#include <cctype>
#include <cstring>
#define rr register
using namespace std;
const int N=161;
struct node{int y,next;}e[N<<1];
int siz[N],as[N],dp[N][N],n,m,et=1,ans;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline signed min(int a,int b){return a<b?a:b;}
inline void dfs(int x,int fa){
siz[x]=1,dp[x][1]=0;
for (rr int i=as[x];i;i=e[i].next)
if (e[i].y!=fa){
dfs(e[i].y,x),siz[x]+=siz[e[i].y];
for (rr int o=siz[x]-siz[e[i].y];o;--o){
for (rr int j=siz[e[i].y];j;--j)
dp[x][o+j]=min(dp[x][o+j],dp[x][o]+dp[e[i].y][j]);
++dp[x][o];
}
}
}
signed main(){
n=iut(),m=iut(),memset(dp,42,sizeof(dp));
for (rr int i=1;i<n;++i){
rr int x=iut(),y=iut();
e[++et]=(node){y,as[x]},as[x]=et;
e[++et]=(node){x,as[y]},as[y]=et;
}
dfs(1,0),ans=dp[1][m];
for (rr int i=2;i<=n;++i) ans=min(ans,dp[i][m]+1);
return !printf("%d",ans);
}

#树形dp#洛谷 1272 重建道路的更多相关文章

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

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

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

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

  3. 树形DP 洛谷P2014 选课

    洛谷P2014 选课 题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门 ...

  4. 洛谷 P1272 重建道路

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

  5. [洛谷P1272] 重建道路

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

  6. 洛谷 P5019 铺设道路

    题目描述 春春是一名道路工程师,负责铺设一条长度为 \(n\) 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 \(n\) 块首尾相连的区域,一开始,第 \(i\) 块区域下陷的深度 ...

  7. 【洛谷P1272】道路重建

    题目大意:给定一个 N 个节点的树,求至少剪掉多少条边才能使得从树中分离出一个大小为 M 的子树. 题解:考虑树形 dp,定义 \(dp[u][i][t]\) 为以 u 为根节点与前 i 个子节点构成 ...

  8. 洛谷P3639 [APIO2013] 道路费用 [生成树的特殊算法]

    题目传送门 道路费用 格式难调,题面就不放了. 分析: 这是一道要细(yan)心(jing)的生成树的好(gui)题. 首先我们看到$k$的范围非常小,那么我们就可以直接$2^k$枚举每一条加边是否选 ...

  9. 洛谷P2052 [NOI2011]道路修建(树形DP)

    题目描述 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿 意修建恰好 n – 1 条双向道路. 每条道 ...

  10. 洛谷4438 [Hnoi2018]道路 【树形dp】

    题目 题目太长懒得打 题解 HNOI2018惊现普及+/提高? 由最长路径很短,设\(f[i][x][y]\)表示\(i\)号点到根有\(x\)条未修公路,\(y\)条未修铁路,子树所有乡村不便利值的 ...

随机推荐

  1. java图书管理系统

    一 .需求 1.使用数组存储学生(学号.姓名.性别.年级.院系.班级)信息数据和图书(书号.书名.出版日期.作者.价格.类别)信息数据 2.学生管理功能:增加学生.删除学生信息.修改学生信息.查询学生 ...

  2. 基于Vue(提供Vue2/Vue3版本)和.Net Core前后端分离、强大、跨平台的快速开发框架

    前言 今天大姚给大家推荐一款基于Vue(提供Vue2/Vue3版本)和.Net Core前后端分离.开源免费(MIT License).强大.跨平台的快速开发框架,并且框架内置代码生成器(解决重复性工 ...

  3. 【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题

    问题描述 Azure Cache for Redis 服务在传输和存储数据时是如何加密呢? 问题回答 一:关于Azure cache for Redis服务在数据传输过程中是如何加密的? 为了确保在A ...

  4. 如何使用 perf 分析 splice 中 pipe 的容量变化

    如何使用 perf 分析 splice 中 pipe 的容量变化 这个文章为了填上一篇文章的坑的,跟踪内核函数本来是准备使用 ebpf 的,但是涉及到了低内核版本,只能使用 kprobe 了. 恰好, ...

  5. kafka的数据同步原理ISR、ACK、LEO、HW

    1.数据可靠性保证,数据同步 为保证 producer 发送的数据,能可靠的发送到指定的 topic,topic 的每个 partition 收到 producer 发送的数据后,都需要向 produ ...

  6. 7、zookeeper应用场景-分布式锁

    分布式锁 实现原理:有序节点+watch监听机制实现 分布式锁有多种实现方式,比如通过数据库.redis都可实现.作为分布式协同工具Zookeeper,当然也有着标准的实现方式.下面介绍在zookee ...

  7. 1. zookeeper简介与应用场景

    1.1 zookeeper介绍   zookeeper是一个高可用的分布式管理与协调框架,基于ZAB算法(原子消息广播协议)的实现. 能够很好保证分布式环境中数据的一致性.正是基于这样的特性,使得zo ...

  8. select 条件语句【GO 基础】

    〇.select 简介 select 语句类似于 switch 语句,但是 select 会随机执行一个可运行的 case.如果没有 case 可运行,它将阻塞,直到有 case 可运行. selec ...

  9. 基于 Mindspore 框架与 ModelArts 平台的 MNIST 手写体识别实验

    简介 实验包含 2部分: 基于 Mindspore 框架的模型本地训练及预测 基于 Modelarts 平台和 PyTorch框架的模型训练及部署 基于 Mindspore 框架的模型本地训练及预测 ...

  10. java学习 javaz-001 Helloworld 第一个demo

    java学习 javaz-001 Helloworld 第一个demo 目录 学习目标 前期准备 java sdk 1.8环境 编辑器IDE的选择 代码开发 目录结构 创建第一个java文件 创建第2 ...