题目链接: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 + 背包思想)的更多相关文章

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

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

  2. POJ 1947 Rebuilding Roads 树形DP

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

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

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

  4. POJ 1947 - Rebuilding Roads 树型DP(泛化背包转移)..

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

  5. [poj 1947] Rebuilding Roads 树形DP

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

  6. POJ 1947 Rebuilding Roads

    树形DP..... Rebuilding Roads Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 8188 Accepted: ...

  7. 树形dp(poj 1947 Rebuilding Roads )

    题意: 有n个点组成一棵树,问至少要删除多少条边才能获得一棵有p个结点的子树? 思路: 设dp[i][k]为以i为根,生成节点数为k的子树,所需剪掉的边数. dp[i][1] = total(i.so ...

  8. POJ 1947 Rebuilding Roads(树形DP)

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

  9. POJ 1947 Rebuilding Roads (树形DP)

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

随机推荐

  1. iOS8 LaunchScreen.storyboard

    我目前的需求是需要将启动图片通过LaunchScreen.storyboard  来实现. 我首先想到的是创建一个Sb,使用自动布局来布局imageview,并设置如下图: 布局好之后,在Image里 ...

  2. 使用NPOI创建Excel文件

    Public Sub BuildExcel() '写入内容到Excel Dim hssfworkbook As HSSFWorkbook = WriteExcel() Dim destFileName ...

  3. 【转】Qt多线程操作界面---在QThread更新QProgressBar

    #include <QApplication> #include <QThread> #include <QMainWindow> #include <QPr ...

  4. php 二维数组的排序

    写这是之前一直二维数组排名困扰.自己写的好复杂. 正题: array_mutisort 官方帮助文档 <?php// 取得列的列表foreach ($data as $key => $ro ...

  5. Xtrabackup流备份与恢复

    Xtrabackup是MySQL数据库的备份不可多得的工具之一.提供了全备,增备,数据库级别,表级别备份等等.最牛X的还有不落盘的备份,即流备份方式.对于服务器上空间不足,或是搭建主从,直接使用流式备 ...

  6. 聊聊Dataguard的三种保护模式实验(下)

    4.最大保护模式Maximum Protection 最大保护模式是DG可以提供的最高保护级别,建立在日志同步传输和确认的基础上.同样,可以使用alter database方法进行设置. SQL> ...

  7. 更改 input type 的值

    需要实现的效果:一个输入框,当输入框未获得焦点的时候,value 值为 “密码”:当输入框失去焦点的时候,输入内容显示为”*****” <input name=”password” type=” ...

  8. C#中的局部类

    什么是局部类型? C# 2.0 引入了局部类型的概念.局部类型允许我们将一个类.结构或接口分成几个部分,分别实现在几个不同的.cs文件中. 局部类型适用于以下情况: (1) 类型特别大,不宜放在一个文 ...

  9. OE7设置菜单为什么这么少?

    默认安装的OE7设置菜单只有很少的功能: 如果需要更多的OE定制,必须开启“技术特性”选项:

  10. 庞锋 OpenCV 视频 学习进度备忘

    书签:另外跳过的内容有待跟进 学习资源: opencv视频教程目录(初级)   主讲:庞锋,毕业于电子科技大学 知识基础支持: 线性代数 应用数学 跳过的内容: 1.第1~6集跳过,简单.(2014- ...