POJ1947 Rebuilding Roads(树形DP)
题目大概是给一棵树,问最少删几条边可以出现一个包含点数为p的连通块。
任何一个连通块都是某棵根属于连通块的子树的上面一部分,所以容易想到用树形DP解决:
- dp[u][k]表示以u为根的子树中,包含根的大小k的连通块最少的删边数
- 要求答案就是min(dp[u][p],min(dp[v][p]+1)),u是整棵树的根,v是其他结点
- 转移从若干个子树各自选择要提供几个k转移,不过指数级时间复杂度,当然又是树上背包了。。
转移好烦,写得我好累好累。。还好1A了。。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define INF (1<<29)
#define MAXN 155
struct Edge{
int u,v,next;
}edge[MAXN];
int NE,head[MAXN];
void addEdge(int u,int v){
edge[NE].u=u; edge[NE].v=v; edge[NE].next=head[u];
head[u]=NE++;
}
int d[MAXN][MAXN],size[MAXN],son[MAXN];
void getSize(int u){
size[u]=;
son[u]=;
for(int i=head[u]; i!=-; i=edge[i].next){
int v=edge[i].v;
getSize(v);
size[u]+=size[v];
++son[u];
}
}
void dp(int u){
d[u][size[u]]=;
d[u][]=;
bool first=;
for(int i=head[u]; i!=-; i=edge[i].next){
int v=edge[i].v;
dp(v);
++d[u][];
if(first){
for(int j=; j<=size[v]; ++j) d[u][j+]=d[v][j];
first=;
}else{
for(int j=size[u]-; j>=; --j){
++d[u][j+];
for(int k=; k<=min(j,size[v]); ++k){
d[u][j+]=min(d[u][j+],d[v][k]+d[u][j+-k]);
}
}
}
}
}
int main(){
for(int i=; i<MAXN; ++i){
for(int j=; j<MAXN; ++j) d[i][j]=INF;
}
memset(head,-,sizeof(head));
int n,p,a,b;
scanf("%d%d",&n,&p);
int deg[MAXN]={};
for(int i=; i<n; ++i){
scanf("%d%d",&a,&b);
addEdge(a,b);
++deg[b];
}
int root;
for(int i=; i<=n; ++i){
if(deg[i]==) root=i;
}
getSize(root);
dp(root);
int res=INF;
for(int i=; i<=n; ++i){
if(root==i) res=min(res,d[i][p]);
else res=min(res,d[i][p]+);
}
printf("%d",res);
return ;
}
POJ1947 Rebuilding Roads(树形DP)的更多相关文章
- POJ1947 - Rebuilding Roads(树形DP)
题目大意 给定一棵n个结点的树,问最少需要删除多少条边使得某棵子树的结点个数为p 题解 很经典的树形DP~~~直接上方程吧 dp[u][j]=min(dp[u][j],dp[u][j-k]+dp[v] ...
- 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 ...
- DP Intro - poj 1947 Rebuilding Roads(树形DP)
版权声明:本文为博主原创文章,未经博主允许不得转载. Rebuilding Roads Time Limit: 1000MS Memory Limit: 30000K Total Submissi ...
- 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 ...
- [poj 1947] Rebuilding Roads 树形DP
Rebuilding Roads Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 10653 Accepted: 4884 Des ...
- POJ 1947 Rebuilding Road(树形DP)
Description The cows have reconstructed Farmer John's farm, with its N barns (1 <= N <= 150, n ...
随机推荐
- js中的闭包之我理解
闭包是一个比较抽象的概念,尤其是对js新手来说.书上的解释实在是比较晦涩,对我来说也是一样. 但是他也是js能力提升中无法绕过的一环,几乎每次面试必问的问题,因为在回答的时候.你的答案的深度,对术语的 ...
- Reverse Pairs
For an array A, if i < j, and A [i] > A [j], called (A [i], A [j]) is a reverse pair.return to ...
- Backpack | & ||
Backpack | Given n items with size Ai, an integer m denotes the size of a backpack. How full you can ...
- hdu2089
基本的数位dp #include <cstdio> #include <cstring> using namespace std; #define D(x) x ; int n ...
- 如何在Win8系统上建立WIFI热点
1.首先将鼠标移到桌面左下角,单击右键,在弹出的快捷菜单中找到“命令提示符(管理员)”,点击 2.点击后,系统就以管理员权限打开了命令提示符,在命令提示符中输入以下命令“netsh wlan set ...
- 火车站(codevs 2287)
题目描述 Description 火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上.下车,但上.下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数 ...
- 侃侃前端MVC设计模式
前言 前端的MVC,近几年一直很火,大家也都纷纷讨论着,于是乎,抽空总结一下这个知识点.看了些文章,结合实践略作总结并发表一下自己的看法. 最初接触MVC是后端Java的MVC架构,用一张图来表示之— ...
- Js 正则表达式特殊字符含义
字符 匹配 \o null \t 制表符 \n 换行符 \v 垂直制表符 \f 换页符 \r 回车符 \xnn 由十六进制nn指定的拉丁字符 ...
- JUC回顾之-CyclicBarrier底层实现和原理
1.CyclicBarrier 字面意思是可循环(Cyclic)使用的屏障(Barrier).它要做的事情是让一组线程到达一个屏障(同步点)时被阻塞,直到最后一个线程到达屏障时候,屏障才会开门.所有被 ...
- ubuntu下安装jdk
参考:http://blog.csdn.net/gobitan/article/details/24322561 Ubuntu Linux下安装Oracle JDK Dennis Hu 2014-4- ...