dp[x][y]表示以x为根的子树要变成有y个点..最少需要减去的边树... 最终ans=max(dp[i][P]+t)  < i=(1,n) , t = i是否为整棵树的根 >

更新的时候分为两种情况..一种是要从其这个孩子转移过来...枚举做01背包..更新出每个状态的最小值..或者说直接砍掉这个孩子..那么只需将所有的状态多加个砍边...

这里的枚举做01背包..意思是由于叶子节点要放多少进去不确定..叶子节点要放的大小以及本节点的空间都在枚举更新...这种概念就是泛化背包..本质上是01背包.做多次01背包

注意到枚举空间的顺序.这样能保证更新的时候不出现混乱....

Program:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<set>
#include<ctime>
#include<algorithm>
#include<queue>
#include<cmath>
#include<map>
#define oo 100000007
#define ll long long
#define pi acos(-1.0)
#define MAXN 155
using namespace std;
vector<int> Tree[MAXN];
int dp[MAXN][MAXN],N,P,ans;
bool root[MAXN];
int dfs(int x)
{
int i,j,y,m=Tree[x].size(),num=1,t,update;
for (i=0;i<=P;i++) dp[x][i]=oo;
dp[x][1]=0;
for (i=0;i<m;i++)
{
y=Tree[x][i];
num+=dfs(y);
for (t=P;t>=1;t--)
{
update=dp[x][t]+1;
for (j=1;j<=t;j++)
update=min(update,dp[x][t-j]+dp[y][j]);
dp[x][t]=update;
} //泛化背包转移
}
t=0;
if (!root[x]) t++;
if (dp[x][P]!=-1) ans=min(dp[x][P]+t,ans);
return num;
}
int main()
{
int i;
while (~scanf("%d%d",&N,&P))
{
for (i=1;i<=N;i++) Tree[i].clear();
memset(root,true,sizeof(root));
for (i=1;i<N;i++)
{
int x,y;
scanf("%d%d",&x,&y);
Tree[x].push_back(y);
root[y]=false;
}
for (i=1;i<=N;i++)
if (root[i]) break;
ans=oo;
dfs(i);
printf("%d\n",ans);
}
return 0;
}

POJ 1947 - Rebuilding Roads 树型DP(泛化背包转移)..的更多相关文章

  1. POJ 1155 - TELE 树型DP(泛化背包转移)..

    dp[x][y]代表以x为根的子树..连接了y个终端用户(叶子)..所能获得的最大收益... dp[x][ ]可以看成当根为x时..有个背包空间为0~m...每个空间上记录了到到达这个空间的最大收益. ...

  2. POJ 1947 Rebuilding Roads (树dp + 背包思想)

    题目链接:http://poj.org/problem?id=1947 一共有n个节点,要求减去最少的边,行号剩下p个节点.问你去掉的最少边数. dp[u][j]表示u为子树根,且得到j个节点最少减去 ...

  3. POJ 1947 Rebuilding Roads(树形DP)

    题目链接 题意 : 给你一棵树,问你至少断掉几条边能够得到有p个点的子树. 思路 : dp[i][j]代表的是以i为根的子树有j个节点.dp[u][i] = dp[u][j]+dp[son][i-j] ...

  4. POJ 1947 Rebuilding Roads (树形DP)

    题意:给一棵树,在树中删除一些边,使得有一个连通块刚好为p个节点,问最少需要删除多少条边? 思路: 因为任一条边都可能需要被删除,独立出来的具有p个节点的连通块可能在任意一处地方.先从根开始DFS,然 ...

  5. POJ 1947 Rebuilding Roads 树形DP

    Rebuilding Roads   Description The cows have reconstructed Farmer John's farm, with its N barns (1 & ...

  6. POJ 1947 Rebuilding Roads 树形dp 难度:2

    Rebuilding Roads Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 9105   Accepted: 4122 ...

  7. DP Intro - poj 1947 Rebuilding Roads(树形DP)

    版权声明:本文为博主原创文章,未经博主允许不得转载. Rebuilding Roads Time Limit: 1000MS   Memory Limit: 30000K Total Submissi ...

  8. POJ题目1947 Rebuilding Roads(树形dp)

    Rebuilding Roads Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 9957   Accepted: 4537 ...

  9. [poj 1947] Rebuilding Roads 树形DP

    Rebuilding Roads Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 10653 Accepted: 4884 Des ...

随机推荐

  1. 用TCGA收集的mRNA表达数据作差异表达

    做差异表达的软件DEseq和edgeR所需要的数据格式必须是原始counts,经过normalization和log2后的数据都不适合,所以对于做差异表达计算的童鞋可以使用ExperimentHub下 ...

  2. MapView

    有两种方式可以将 MapView 添加到应用当中:一个是 XML 方式,另一个是硬编码方式:一般多采用 XML方式,方便调整布局及其属性相关设置. 1.1XML方式 <com.esri.andr ...

  3. 【原创】解决国内Android SDK无法更新问题更新

    使用代理,推荐使用shadowsock 在SDK Manage的tools-options填好代理 服务器地址127.0.0.1 端口1080

  4. 40. Testing Prev Part IV. Spring Boot features

    40. Testing Spring Boot provides a number of utilities and annotations to help when testing your app ...

  5. 在MAC上安装GitHub DeskTop

    下载Git工具:下载链接 https://git-scm.com/downloads/ 然后配置Git:配置教程链接  http://jingyan.baidu.com/article/ceb9fb1 ...

  6. 电脑只能上QQ,不能上网浏览网站怎么解决

    这个问题通常是因为网络的DNS解析出错引起的.QQ一类的聊天软件有自动的网络解析,不需要DNS便可以使用,而一般的浏览器是需要DNS解析来访问网页的.所谓DNS,即域名服务器(Domain Name ...

  7. ssm项目跨域访问

    最近使用ssm开发了一个项目,为了项目的开发速度,采用的是前后端同时开发,所以前端文件没有集成在项目中,最后在调试时涉及到了跨域.跨域的解决方法很多,我采用的是最简单的一种,代码如下: 新建一个过滤器 ...

  8. opencv: 基本知识(二);

    1.cvArr* 与 cv::Mat之间的转换; cv::Mat ---- > cvArr* cv::Mat img; IplImage temp = IplImage(img); cvArr ...

  9. [转]python3之os与sys模块

    转自:https://www.cnblogs.com/zhangxinqi/p/7826872.html#_label8 阅读目录 一.Python os模块 1.os.access() 2.os.c ...

  10. 步步为营-75-Cookie简介

    说明:cookie常用于数据保存 1 使用 //创建cookie Response.cookies["yk"].value ="xyxtl"; //设置过期时间 ...