poj1947
树上背包?
问最少断掉多少条边可以形成节点数为k的块
设f[i,j]表示以节点i为根,形成一个节点数为k的块要断多少条边
则有:f[x,j]:=min(f[x,j],f[x,j-k]+f[y,k]-2) y是x的孩子
为什么要减2,现在装入以y为节点的子树,x和y之间的边,这条边自然不用断了,但在计算f[y,k]和f[x,1]的时候,这条边被断了两次
const max=;
var f,son:array[..,..] of longint;
fa,s,t:array[..] of longint;
j,x,y,i,n,m,root,ans:longint; procedure treedp(x:longint);
var i,y,j,k:longint;
begin
t[x]:=;
for i:= to s[x] do
begin
treedp(son[x,i]);
t[x]:=t[x]+t[son[x,i]]; //先统计子树规模
end;
f[x,]:=s[x];
if x<>root then inc(f[x,]); //细节 注意要断他父亲和它之间的边
for i:= to s[x] do
begin
y:=son[x,i];
for j:=t[x] downto do //注意背包的倒推,每个子树显然只能用一次,相当于01背包
for k:= to t[y] do
if j-k>= then f[x,j]:=min(f[x,j],f[x,j-k]+f[y,k]-)
else break;
end; end; begin
readln(n,m);
for i:= to n- do
begin
readln(x,y);
s[x]:=s[x]+; //题目中给定了父子关系
son[x,s[x]]:=y;
fa[y]:=x;
end;
for i:= to n do
for j:= to n do
f[i,j]:=max;
root:=;
while fa[root]<> do inc(root);
treedp(root);
ans:=max;
for i:= to n do
ans:=min(ans,f[i,m]);
writeln(ans);
end.
很好的treedp,一般来说,treedp都是先dfs再回来做dp……
总的复杂度O(n^3);题目其实不难,多想想就好
poj1947的更多相关文章
- poj1947(树上分组背包)
题目链接:https://vjudge.net/problem/POJ-1947 题意:给定一棵树,求得到一个结点数为p最少删多少条边. 思路: 明显的树形dp,分组背包.用dp[u][j]表示在结点 ...
- POJ1947 Rebuilding Roads[树形背包]
Rebuilding Roads Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 11495 Accepted: 5276 ...
- [USACO2002][poj1947]Rebuilding Roads(树形dp)
Rebuilding RoadsTime Limit: 1000MS Memory Limit: 30000KTotal Submissions: 8589 Accepted: 3854Descrip ...
- POJ1947 Rebuilding Roads
Description The cows have reconstructed Farmer John's farm, with its N barns (1 <= N <= 150, n ...
- POJ1947 Rebuilding Roads(树形DP)
题目大概是给一棵树,问最少删几条边可以出现一个包含点数为p的连通块. 任何一个连通块都是某棵根属于连通块的子树的上面一部分,所以容易想到用树形DP解决: dp[u][k]表示以u为根的子树中,包含根的 ...
- 树形DP(Rebuilding Roads poj1947)
题意:给出一颗树,求要形成一颗元素个数是p的子树,最少要去掉多少边 #include"stdio.h" #include"string.h" #include& ...
- POJ-1947 Rebuilding Roads (树形DP+分组背包)
题目大意:将一棵n个节点的有根树,删掉一些边变成恰有m个节点的新树.求最少需要去掉几条边. 题目分析:定义状态dp(root,k)表示在以root为根节点的子树中,删掉一些边变成恰有k个节点的新树需要 ...
- POJ1947 - Rebuilding Roads(树形DP)
题目大意 给定一棵n个结点的树,问最少需要删除多少条边使得某棵子树的结点个数为p 题解 很经典的树形DP~~~直接上方程吧 dp[u][j]=min(dp[u][j],dp[u][j-k]+dp[v] ...
- poj1947(树形dp)
题目链接:http://poj.org/problem?id=1947 题意:给n(n<=150)个点的一棵树,求删掉最少边数k使得最后该树只剩下p(1<=p<=n)个节点.(求最小 ...
随机推荐
- WordPress 模板常用函数
WordPress 基本模板文件 一套完整的 WordPress 模板应至少具有如下文件: style.css : CSS(样式表)文件 index.php : 主页模板 archive.php : ...
- jQuery回车事件
有网就是好. 全局事件: document.onkeydown=function(e){ var ev=document.all?window.evevt:e; if(ev.keyCode==13){ ...
- java之StringBuffer
StringBuffer就是字符串缓冲区,用于存储数据的容器. 特点:长度可变,可存储不同类型的数据,最终转化成字符串使用,可以对字符串修改 功能: 添加:append(value), insert( ...
- Django文档——Model字段类型(Field Types)
大部分内容参考自http://wrongwaycn.github.io/django11/topics/db/models/index.html#topics-db-models ,内容是django ...
- Nginx配置文件变量大全
$args # 这个变量等于请求行中的参数. $binary_remote_addr # 远程地址的二进制表示 $body_bytes_sent # 已发送的消息体字节数 $content_lengt ...
- Weblogic12c安装与配置详解
Weblogic是什么Weblogic的安装Weblogic创建域Weblogic管理域Weblogic的应用Weblogic是什么 Weblogic这是我入职以后第一次接触到的词汇,我很陌生,就从我 ...
- WdatePicker 设置开始时间和结束时间
开始时间: <input type="text" placeholder=" -请选择- " readonly="readonly" ...
- 原生JS的对象常用操作总结
前端时间写了篇怎么判断js对象相等的文章,一直在期待大神给点消息,无奈一直杳无音讯,还是自己写个函数来进行判断,下面总结一些常用的对象操作的方法. 咋们来个先抑后扬的方式,先放出几个基本的 ...
- uc/os 任务删除
问题描述: uc/os 任务删除 问题解决: uc/os任务删除流程图 具体代码 注: 如上是关中断,以及取消优先级对应的就绪标志 关中断代码为: 取消就绪标志,实际上是将就绪表中指定 ...
- 在ECLIPSE中用MAVEN和TOMCAT来建立WEBAPP
找了很多示例,结合以下两个URL,比较简单的测试了一下. http://blog.csdn.net/clj198606061111/article/details/20221133 http://ww ...