P1272 重建道路 | 树上背包
时间:2021-09-16
本文章向大家介绍P1272 重建道路 | 树上背包,主要包括P1272 重建道路 | 树上背包使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目描述
从一棵树上选择数量最少的边断开 使得拆出的子树大小为P
题解
树上dp
设 \(f[i][j]\) 表示子树i中拆分出j个节点 需要最少删去多少边
考虑树上背包的模板 我们对于一个节点now
合并时候 把该节点的每个子树看成一个组 子树中每一个点看成物品进行分组背包
由于每个非根节点想要单独拆分出来,所以答案要+1
最后,由于拆分并不需要在根节点进行
所以对于每个节点都可以看一看有没有更优秀的答案
code:
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
#define maxn 159
int n,p;
int f[maxn][maxn];
vector<int> son[maxn];
int dfs(int now,int fa)//返回子树个数
{
f[now][1]=0;
int size=1;
for(int i=0;i<son[now].size();i++)
{
int to=son[now][i];
if(to==fa)continue;
int tk=dfs(to,now);
size+=tk;
for(int j=size;j>=0;j--)//分j组
{
f[now][j]++;
for(int k=0;k<=min(tk,j-1);k++)//j-1强制选根
{
f[now][j]=min(f[now][j],f[to][k]+f[now][j-k]);
}
}
}
return size;
}
signed main()
{
scanf("%d%d",&n,&p);
memset(f,0x3f,sizeof(f));
for(int i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
son[x].push_back(y);
son[y].push_back(x);
}
dfs(1,0);
int ans=f[1][p];
for(int i=2;i<=n;i++)ans=min(ans,f[i][p]+1);
printf("%d\n",ans);
return 0;
}
/*
f[i][j]表示子树i中分离出j个节点需要多少道路
强制当前子树i和父节点相连
f[i][j]变成了 有s个物品 每个节点有
*/
``
原文地址:https://www.cnblogs.com/lzy-blog/p/15294779.html
- 13.4 mysql用户管理
- Linux基础(day54)
- 13.3 mysql常用命令
- 13.2 连接mysql
- JDK容器学习之List: CopyOnWriteArrayList,ArrayList,LinkedList对比
- 13.1 设置更改root密码
- 12.23 open_basedir
- JDK容器学习之CopyOnWriteArrayList:线程安全保障机制
- JDK容器学习之LinkedList:底层存储&读写逻辑
- Linux基础(day53)
- 15.4 xshell使用xftp传输文件
- JDK容器学习之ArrayList:底层存储和动态扩容
- Linux基础(day57)
- 15.2/15.3 使用vsftpd搭建ftp
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP内置函数生成随机数实例
- PHPStudy下如何为Apache安装SSL证书的方法步骤
- PHP的mysqli_thread_id()函数讲解
- thinkPHP框架中layer.js的封装与使用方法示例
- OpenCV+python实现实时目标检测功能
- 在tensorflow实现直接读取网络的参数(weight and bias)的值
- python tkiner实现 一个小小的图片翻页功能的示例代码
- 在Pytorch中使用Mask R-CNN进行实例分割操作
- PHP类的自动加载机制实现方法分析
- strpos() 函数判断字符串中是否包含某字符串的方法
- Laravel框架基于ajax和layer.js实现无刷新删除功能示例
- 详解php伪造Referer请求反盗链资源
- Laravel框架基于ajax实现二级联动功能示例
- django haystack实现全文检索的示例代码
- 基于Python下载网络图片方法汇总代码实例