POJ 1947 Rebuilding Roads (树dp + 背包思想)
题目链接:http://poj.org/problem?id=1947
一共有n个节点,要求减去最少的边,行号剩下p个节点。问你去掉的最少边数。
dp[u][j]表示u为子树根,且得到j个节点最少减去的边数。
考虑两种情况,去掉孩子节点v与去不掉。
(1)去掉孩子节点:dp[u][j] = dp[u][j] + 1
(2)不去掉孩子节点:dp[u][j] = min(dp[u][j - k] + dp[v][k])
综上就是dp[u][j] = min(dp[u][j] + 1, min(dp[u][j - k] + dp[v][k]))
//#pragma comment(linker, "/STACK:102400000, 102400000")
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cmath>
#include <ctime>
#include <list>
#include <set>
#include <map>
using namespace std;
typedef long long LL;
typedef pair <int, int> P;
const int N = ;
int dp[N][N], n, p, inf = 1e8;
vector <int> edge[N];
//dp[i][j]表示i为子树根,且得到j个节点最少减去的边数。不考虑父节点 void dfs(int u, int par) {
for(int i = ; i <= p; ++i) {
dp[u][i] = inf;
}
dp[u][] = ; //考虑到叶子节点,而非叶子节点在下面的for中会增加
for(int i = ; i < edge[u].size(); ++i) {
int v = edge[u][i];
if(v == par)
continue;
dfs(v, u);
for(int j = p; j >= ; --j) {
//有点背包的思想,正序的话dp[u][j]可能由dp[v][k]转移而来,在下面会被重复转移。倒序的话保证转移一次。
int temp = dp[u][j] + ; //去掉v子树
for(int k = ; k < j; ++k) {
temp = min(dp[u][j - k] + dp[v][k], temp);
}
dp[u][j] = temp; //最优 跟最短路思想类似
}
}
} int main()
{
int u, v;
while(~scanf("%d %d", &n, &p)) {
for(int i = ; i <= n; ++i) {
edge[i].clear();
}
for(int i = ; i < n; ++i) {
scanf("%d %d", &u, &v);
edge[u].push_back(v);
edge[v].push_back(u);
}
dfs(, -);
int res = dp[][p]; //根节点没有父亲 不需要+1
for(int i = ; i <= n; ++i) {
res = min(dp[i][p] + , res); //其他节点有父节点 去除的话所以+1
}
printf("%d\n", res);
}
return ;
}
这题感觉好难想,人笨没办法
POJ 1947 Rebuilding Roads (树dp + 背包思想)的更多相关文章
- DP Intro - poj 1947 Rebuilding Roads(树形DP)
版权声明:本文为博主原创文章,未经博主允许不得转载. Rebuilding Roads Time Limit: 1000MS Memory Limit: 30000K Total Submissi ...
- POJ 1947 Rebuilding Roads 树形DP
Rebuilding Roads Description The cows have reconstructed Farmer John's farm, with its N barns (1 & ...
- POJ 1947 Rebuilding Roads 树形dp 难度:2
Rebuilding Roads Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 9105 Accepted: 4122 ...
- POJ 1947 - Rebuilding Roads 树型DP(泛化背包转移)..
dp[x][y]表示以x为根的子树要变成有y个点..最少需要减去的边树... 最终ans=max(dp[i][P]+t) < i=(1,n) , t = i是否为整棵树的根 > 更新的时 ...
- [poj 1947] Rebuilding Roads 树形DP
Rebuilding Roads Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 10653 Accepted: 4884 Des ...
- POJ 1947 Rebuilding Roads
树形DP..... Rebuilding Roads Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 8188 Accepted: ...
- 树形dp(poj 1947 Rebuilding Roads )
题意: 有n个点组成一棵树,问至少要删除多少条边才能获得一棵有p个结点的子树? 思路: 设dp[i][k]为以i为根,生成节点数为k的子树,所需剪掉的边数. dp[i][1] = total(i.so ...
- POJ 1947 Rebuilding Roads(树形DP)
题目链接 题意 : 给你一棵树,问你至少断掉几条边能够得到有p个点的子树. 思路 : dp[i][j]代表的是以i为根的子树有j个节点.dp[u][i] = dp[u][j]+dp[son][i-j] ...
- POJ 1947 Rebuilding Roads (树形DP)
题意:给一棵树,在树中删除一些边,使得有一个连通块刚好为p个节点,问最少需要删除多少条边? 思路: 因为任一条边都可能需要被删除,独立出来的具有p个节点的连通块可能在任意一处地方.先从根开始DFS,然 ...
随机推荐
- LA 4794 Sharing Chocolate
大白书中的题感觉一般都比较难,能理解书上代码就已经很不错了 按照经验,一般数据较小的题目,都有可能是用状态压缩来解决的 题意:问一个面积为x×y的巧克力,能否切若干刀,将其切成n块面积为A1,A2,, ...
- UVa 10048 Audiophobia【Floyd】
题意:给出一个c个点,s条边组成的无向图,求一点到另一点的路径上最大权值最小的路径,输出这个值 可以将这个 d[i][j]=min(d[i][j],d[i][k]+d[k][j]) 改成 d[i][j ...
- MapView的用法
一.MapView 1.显示用户的位置点(用蓝色圆点标记) mapView.showsUserLocation = YES; 2.代理方法 1> 当定位到用户的位置就会调用 - (void)ma ...
- for...else循环
如果for循环完整结束,无break打断循环,那么执行else里面的内容,否则不执行. while True: n = raw_input('>') for x in n: if x == 'f ...
- jboss集成eclipse
eclipse Kepler + Jboss7.1 参考引用文档: http://www.tekdigest.com/how-to-install-jboss-tools-in-eclipse.htm ...
- 平板与PC的文件交互及播放
发现在kindle上可以用ES开个浏览器,把FTP打开,实现文件的互访,之前还弄了一个大圈下了一大堆的垃圾软件, 而看电脑上的流媒体的话,则可以用dice播放器add一下samba就可以了
- Image.FromFile 方法锁住文件解决方法
Image.FromFile 一旦使用后,对应的文件在一直调用 其生成的Image对象被Disponse前都不会被解除锁定,这就造成了一个问题,就是在这个图形被解锁前无法对图像进行操作(比如删除,修 ...
- Eclipse安装配置PyDev插件
Eclipse安装配置PyDev插件 关于PyDev PyDev是一个功能强大的 Eclipse插件,使用户可用 Eclipse 来进行 Python 应用程序的开发和调试.PyDev 插件的出现方便 ...
- EFSQLserver
1.增加一条烽据 FLYNEWQKEntities dataContext = new FLYNEWQKEntities(); Log log = new Log(); log.Data1 = &qu ...
- 八皇后问题 --- 递归解法 --- java代码
八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上.八皇后 ...