poj 1947 树形背包 (删边)
http://blog.csdn.net/woshi250hua/article/details/7632785
这道题我一开始想的dp[i][j],i是节点,j是删除的点数,dp是最少删边的个数,然而状态转移方程不太好想。
而题解其实差不多,只不过j为剩余点的个数
这样我们就有最初状态,dp[i][1] = 子节点个数,而dp[i][j]就可以从子节点的状态推出来
dp[i][j] = min(dp[i][j],dp[i][k]-1+dp[s][j-k]) (1<=i<=n,2<=j<=sum(节点总和),1<=k<j,s为i子节点)(i中已有k个节点并从s中选择j-k个,算最少删除边数,s选上所以i->s的边不需删除,所以-1)
- #include <iostream>
- #include <string>
- #include <cstring>
- #include <cstdlib>
- #include <cstdio>
- #include <cmath>
- #include <algorithm>
- #include <stack>
- #include <queue>
- #include <cctype>
- #include <vector>
- #include <iterator>
- #include <set>
- #include <map>
- #include <sstream>
- using namespace std;
- #define mem(a,b) memset(a,b,sizeof(a))
- #define pf printf
- #define sf scanf
- #define spf sprintf
- #define pb push_back
- #define debug printf("!\n")
- #define MAXN 1010
- #define MAX(a,b) a>b?a:b
- #define blank pf("\n")
- #define LL long long
- #define ALL(x) x.begin(),x.end()
- #define INS(x) inserter(x,x.begin())
- #define pqueue priority_queue
- #define INF 0x3f3f3f3f
- int n,m;
- struct node
- {
- int y,next;
- }tree[];
- int head[],dp[][],ptr=;
- int sum[],vl[],vis[];
- void add(int x,int y)
- {
- tree[ptr].y = y;
- tree[ptr].next = head[x];
- head[x] = ptr++;
- }
- void dfs(int root)
- {
- if(vis[root]) return;
- int i,j,k;
- vis[root] = sum[root] = ;
- int tot = ;
- for(i=head[root]; i!=-; i=tree[i].next)
- {
- int p = tree[i].y;
- if(!vis[p])
- {
- dfs(p);
- sum[root]+=sum[p];
- tot++;
- //pf("i%d p%d tot%d sum%d\n",root,p,tot,sum[root]);
- }
- }
- dp[root][] = tot;
- for(i=head[root]; i!=-; i=tree[i].next)
- {
- int p = tree[i].y;
- for(j = sum[root];j>;j--)
- {
- for(k = ;k<j;k++)
- {
- if(dp[root][k]!=INF && dp[p][j-k]!=INF)
- {
- dp[root][j] = min(dp[root][j],dp[root][k]+dp[p][j-k]-);
- //pf("i%d j%d k%d p%d dp%d\n",root,j,k,p,dp[root][j]);
- }
- }
- }
- }
- }
- int main()
- {
- int i,j,k,a,b;
- while(~sf("%d%d",&n,&m) && m+n>)
- {
- mem(head,-);
- ptr = ;
- for(i=;i<=n-;i++)
- {
- sf("%d%d",&a,&b);
- add(a,b);
- add(b,a);
- }
- mem(dp,INF);
- mem(vis,);
- dfs();
- int ans = INF;
- for (i = ; i <= n; ++i) {
- if (i == )
- ans = min(ans,dp[i][m]);
- else ans = min(ans,dp[i][m]+);//非根节点要删除连到父亲节点的那条边
- }
- printf("%d\n",ans);
- }
- return ;
- }
poj 1947 树形背包 (删边)的更多相关文章
- poj 1947 树形背包
重做这道题 http://blog.csdn.net/woshi250hua/article/details/7632785 http://blog.csdn.net/shuangde800/arti ...
- poj 1155 树形背包
http://blog.csdn.net/libin56842/article/details/9908199 树形背包: 首先是建树,每个结构体为一个节点,包括下一个点序号,值,和next. tre ...
- poj 1947(树形DP+背包)
Rebuilding Roads Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 10663 Accepted: 4891 ...
- POJ 1155 树形背包(DP) TELE
题目链接: POJ 1155 TELE 分析: 用dp[i][j]表示在结点i下最j个用户公司的收益, 做为背包处理. dp[cnt][i+j] = max( dp[cnt][i+j ...
- poj 1947 树形dp
思路:dp[i][j]表示,以i节点为根,删去j个节点最少要断几条边. 那么dp[u][j]=min(dp[u][j],dp[v][k]+dp[u][j-k]);//选取最优状态 dp[u][j]=m ...
- POJ 1155-TELE(树形背包)
题意:电视台发送信号给很多用户,每个用户(叶子节点)有愿意出的钱,电视台经过的路线都有一定费用,求电视台不损失的情况下最多给多少用户发送信号. 分析:问题与以i为根节点的子树所包含的叶子数 #incl ...
- POJ 2486 树形背包DP Apple Tree
设d(u, j, 0)表示在以u为根的子树中至多走k步并且最终返回u,能吃到的最多的苹果. 则有状态转移方程: #include <iostream> #include <cstdi ...
- UVa 1407 树形背包 Caves
这道题可以和POJ 2486 树形背包DP Apple Tree比较着来做. 参考题解 #include <iostream> #include <cstdio> #inclu ...
- POJ 1155 (树形DP+背包+优化)
题目链接: http://poj.org/problem?id=1155 题目大意:电视台转播节目.对于每个根,其子结点可能是用户,也可能是中转站.但是用户肯定是叶子结点.传到中转站或是用户都要花钱, ...
随机推荐
- JS关闭页面弹窗提醒
<html> <head><title>JS测试</title> <script type="text/javascript" ...
- vue数据响应的坑
1.首先遇到的第一个坑是数组 vue初始化时,data是一个数组并且为空的时候,里面有一些对象元素,直接改变这些对象的的属性不会触发视图更新 解决办法,copy一个新的数组(vue.assign是浅c ...
- css3中的translate,transform,transition的区别
translate:移动,transform的一个方法 通过 translate() 方法,元素从其当前位置移动,根据给定的 left(x 坐标) 和 top(y 坐标) ...
- 面试笔试(C++部分)
1.define 和const,inline的区别 define的缺点: 1.边界效应(必须加括号,才能避免边界效应) #define MUL(A,B) A*B 而在使用的时候,这样的调用: ,b=, ...
- ubuntu下面的某些软件安装
1. python 下面的mysql驱动:不是在pip里面安装,执行下面命令 apt-get install python-mysqldb
- (STM32F4) SysTick理解使用
關於Cortex System Timer (Systick) 網上隨便google就可以找到許多相關範例. 他就是ARM提供的一個24-bit的下數(count-down)計時器我看大部分應用都是提 ...
- PostMan --API调试工具
https://blog.csdn.net/fxbin123/article/details/80428216
- Java中String与Date格式之间的转换
转自:https://blog.csdn.net/angus_17/article/details/7656631 经常遇到string和date之间的转换,把相关的内容总结在这里吧: 1.strin ...
- proxyTable设置跨域
如何设置跨域 1.在config--index.js 中配置 proxyTable: { '/api': { target: 'http://www.xxx.com', //目标接口域名 change ...
- Ionic3,组件的使用(四)
说明 因为同样是作为 Ionic3 小白,所以很多东西都是自己摸索出来的,可能有很多不合理的地方,请多多指正. 效果图 细节说明 一:组件.页面均采用 懒加载: 二:页面的头部标题栏,采用了组件化的方 ...