poj1947(树上分组背包)
题目链接:https://vjudge.net/problem/POJ-1947
题意:给定一棵树,求得到一个结点数为p最少删多少条边。
思路:
明显的树形dp,分组背包。用dp[u][j]表示在结点u的子树上选j个结点最少要删除的边(一定包含结点u),那么dp[u][1]=num[u],num[u]表示结点u的子结点个数,然后转移方程为:
dp[u][j]=min(dp[u][j] , dp[u][j-k]+dp[v][k]-1),v是u的子结点,k表示在v的子树中选k个结点,-1是因为选择了v那么u->v的边不用删了。
最后的结果是min(dp[1][p],dp[i][p]+1) (i>=2),因为如果不为根节点,还要删除i与其父结点的边。
AC代码:
#include<cstdio>
#include<algorithm>
using namespace std; const int maxn=;
const int inf=0x3f3f3f3f;
int n,p,ans,cnt,head[maxn],son[maxn],num[maxn],dp[maxn][maxn]; struct node{
int v,nex;
}edge[maxn]; void adde(int u,int v){
edge[++cnt].v=v;
edge[cnt].nex=head[u];
head[u]=cnt;
} void dfs(int u){
son[u]=;
dp[u][]=num[u];
for(int i=head[u];i;i=edge[i].nex){
int v=edge[i].v;
dfs(v);
son[u]+=son[v];
for(int j=son[u];j>;--j)
for(int k=;k<=min(j-,son[v]);++k)
dp[u][j]=min(dp[u][j],dp[u][j-k]+dp[v][k]-);
}
} int main(){
while(~scanf("%d%d",&n,&p)){
cnt=;
for(int i=;i<=n;++i)
head[i]=num[i]=;
for(int i=;i<n;++i){
int u,v;
scanf("%d%d",&u,&v);
adde(u,v);
++num[u];
}
for(int i=;i<=n;++i)
for(int j=;j<=n;++j)
dp[i][j]=inf;
dfs();
ans=dp[][p];
for(int i=;i<=n;++i)
if(son[i]>=p)
ans=min(ans,dp[i][p]+);
printf("%d\n",ans);
}
return ;
}
poj1947(树上分组背包)的更多相关文章
- 【题解】洛谷P1273 有线电视网(树上分组背包)
次元传送门:洛谷P1273 思路 一开始想的是普通树形DP 但是好像实现不大好 观摩了一下题解 是树上分组背包 设f[i][j]为以i为根的子树中取j个客户得到的总价值 我们可以以i为根有j组 在每一 ...
- 洛谷P1273 有线电视网 树上分组背包DP
P1273 有线电视网 )逼着自己写DP 题意:在一棵树上选出最多的叶子节点,使得叶子节点的值 减去 各个叶子节点到根节点的消耗 >= 0: 思路: 树上分组背包DP,设dp[u][k] 表示 ...
- hdoj1011(树上分组背包)
题目链接:https://vjudge.net/problem/HDU-1011 题意:给定一颗树,每个结点有两个属性,即花费V和价值w,并且选择子结点时必须选择父结点,求总花费不超过m的最大价值. ...
- poj1155 TELE (树上分组背包)
题目链接:https://vjudge.net/problem/POJ-1155 题意:给定一颗以1为根的边权树,有n个结点,其中m个叶子结点,每个叶子结点有一个价值.要求从m个叶子结点中选最多的结点 ...
- 洛谷P1273 有线电视网 (树上分组背包)
洛谷P1273 有线电视网 题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节 ...
- 洛谷 P1273 有线电视网 && caioj 1109 树形动态规划(TreeDP)4:比赛转播(树上分组背包总结)
从这篇博客往前到二叉苹果树都可以用分组背包做 这依赖性的问题,都可以用于这道题类似的方法来做 表示以i为根的树中取j个节点所能得的最大价值 那么每一个子树可以看成一个组,每个组里面取一个节点,两个节点 ...
- 洛谷P1273 有线电视网 【树上分组背包】
题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点. 从转播站到转播站以及从 ...
- HDU-1011 Starship Troopers (树形DP+分组背包)
题目大意:给一棵有根带点权树,并且给出容量.求在不超过容量下的最大权值.前提是选完父节点才能选子节点. 题目分析:树上的分组背包. ps:特判m为0时的情况. 代码如下: # include<i ...
- 2018.12.14 codeforces 922E. Birds(分组背包)
传送门 蒟蒻净做些水题还请大佬见谅 没错这又是个一眼的分组背包. 题意简述:有n棵树,每只树上有aia_iai只鸟,第iii棵树买一只鸟要花cic_ici的钱,每买一只鸟可以奖励bbb块钱,从一棵 ...
随机推荐
- Java进阶知识24 Spring的事务管理(事务回滚)
1.事务控制概述 1.1.编程式事务控制 自己手动控制事务,就叫做编程式事务控制. Jdbc代码: connection.setAutoCommit(false); ...
- tarjan——校园网(缩点,再构图)
P2746 [USACO5.3]校园网Network of Schools 任务一:求缩完点后入度为0的点的个数(有向边) 任务二:求缩完点后入度为0和出度为0的最大值(要把图构造成强连通分量) 注意 ...
- Centos 查看CPU个数、核心数等信息
总核数 = 物理CPU个数 X 每颗物理CPU的核数 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 查看物理CPU个数 cat /proc/cpuinfo| grep & ...
- css定位中的百分比
----转载自自己在牛人部落中的相关文章--- 在前端css定位中经常面对的一个问题是,百分比定位究竟是针对于谁定位? 一.margin,padding的百分比 首先从css的设计意图说起,在浏览器默 ...
- ICEM-水雷
原视频下载地址: https://yunpan.cn/cqhsvXAKUQEA4 访问密码 ef39
- 学习ES7+ES8
es6 语法:http://es6.ruanyifeng.com/#docs/async 作者:阮一峰 撰文为何 身为一个前端开发者,ECMAScript(以下简称ES)早已广泛应用在我们的工作 ...
- pwn学习日记Day22 《程序员的自我修养》读书笔记
知识杂项 软连接 命令: ln -s 原文件 目标文件 特征: 1.相当于windows的快捷方式 2.只是一个符号连接,所以软连接文件大小都很小 3.当运行软连接的时候,会根据连接指向找到真正的文件 ...
- java安全学习-Code-Breaking Puzzles-javacon详细分析
本文首发于合天智汇: https://mp.weixin.qq.com/s/XWpe3OGwH1d9dYNMqfnyzA 0x01.环境准备 需要反编译的jar包如下所示 直接通过以下步骤将jar文件 ...
- linux C file format analysis
c语言文件格式 source file file.c C source, ASCII text pretreatment 预处理文件 file.i C source, ASCII text assem ...
- 在SQLAlchemy ORM中动态变更表名
在开发过程中,经常会遇到几张表结构相同,仅仅表名不一样.这在直接使用SQL语句进行查询的环境中处理起来很简单,但如果使用了SQLAlchemy ORM之后,因在model定义时就确定了表名,就需要用其 ...