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)个节点.(求最小 ...
随机推荐
- RHEL 7.2 安装Oracle XE-11.2.0
轻量快捷版本,适合开发 0. /etc/hosts 添加 本机hostname # hostnamepromote.cache-dns.local # cat /etc/hosts127.0.0.1 ...
- centos架设FTP服务器
1.安装vsftp在这里,我们架设的是虚拟用户,所谓虚拟用户就是没有使用真实的帐户,只是通过某种手段达到映射帐户和设置权限的目的.yum -y install vsftpd在CentOS中,这样就可以 ...
- (转载)sql语句解决分页问题
<来源网址:http://www.delphifans.com/infoview/Article_353.html>sql语句解决分页问题日期:2005年1月17日 作者:treemon2 ...
- Jqplot在joomla组件中的应用
(1)在com_collect组件中采用的是ajax获取json类型的值.[http://www.jqplot.com/tests/data-renderers.php]这上边有实例. (2)在jqp ...
- DHT网络第一部分研究结果 加入长期在线的node
源码:http://jijiea.com/upfile/DHT_Part1_How_To_Join_In_DHT.zip
- Linux ps 命令获取查询结果中的单列信息
1.查看所有进程信息,但是只想获取COMMAND列的值 SDCxM-SDCAM-root-root> ps auxUSER PID %CPU %MEM VSZ RSS TT ...
- Python学习_数据排序方法
Python对数据排序又两种方法: 1. 原地排序:采用sort()方法,按照指定的顺序排列数据后用排序后的数据替换原来的数据(原来的顺序丢失),如: >>> data1=[4,2, ...
- ACM俱乐部 字符串
数制转换分数: 2 时间限制:1 秒 内存限制:32 兆 特殊判题: 否 提交:59 解决: 24 标签 进制转换 题目描述 求任意两个不同进制非负整数的转换(2进制-16进制),所给整数在long所 ...
- c# 赋值后最后一项数据部分丢失
赋值,赋值后 原因,在添加后立即调用clear()清除数据....
- Java中“||”与“|”的区别
两者都是或,但是不一样.举个例实例给你看你就明白了: int i=0;if(3>2 || (i++)>1) i=i+1;System.out.println(i); 这段程序会打印出1,而 ...