题目链接: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. phpcms还原被删除的栏目

    1.在这个目录下/caches/bakup/default导出文件category.sql 2.登录网站的数据管理页面phpmyadmin 3.导入数据库选择category.sql 4.登陆网站后台 ...

  2. Heritrix源码分析(八) Heritrix8个处理器(Processor)介绍(转)

    本博客属原创文章,欢迎转载!转载请务必注明出处:http://guoyunsky.iteye.com/blog/643367       本博客已迁移到本人独立博客: http://www.yun5u ...

  3. mysql 优化analyze table

    Analyze Table MySQL 的Optimizer(优化元件)在优化SQL语句时,首先需要收集一些相关信息,其中就包括表的cardinality(可以翻译为“散列程度”),它表示某个索引对应 ...

  4. java 构造函数内部的多态方法 完全剖析

    我们先来看一个例子,如果你读过<java编程思想>的话 应该会有印象 package com.test.zj; public class PolyConstructors { public ...

  5. photoshop,用切片工具等分图片

    一,切片 二,导出: 菜单->文件->存储为Web和设备所用格式 将预设改为PNG-24,然后点存储.

  6. linux下valgrind的使用概述

    Valgrind简介: Valgrind是动态分析工具的框架.有很多Valgrind工具可以自动的检测许多内存管理和多进程/线程的bugs,在细节上剖析你的程序.你也可以利用Valgrind框架来实现 ...

  7. Redis 主从 Replication 的配置,主从复制原理

    概述 Redis的replication机制允许slave从master那里通过网络传输拷贝到完整的数据备份.具有以下特点: 异步复制.从2.8版本开始,slave能不时地从master那里获取到数据 ...

  8. Web 通信 之 长连接、长轮询(long polling)(转)

    基于HTTP的长连接,是一种通过长轮询方式实现"服务器推"的技术,它弥补了HTTP简单的请求应答模式的不足,极大地增强了程序的实时性和交互性. 一.什么是长连接.长轮询? 用通俗易 ...

  9. 【转】linux打包压缩命令

    转自:http://www.cnblogs.com/end/archive/2011/04/20/2022614.html tar命令 [root@linux ~]# tar [-cxtzjvfpPN ...

  10. 操作符重载.xml

    pre{ line-height:1; color:#1e1e1e; background-color:#d2d2d2; font-size:16px;}.sysFunc{color:#627cf6; ...