博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj1947Rebuilding Roads(树形DP)
阅读量:4578 次
发布时间:2019-06-08

本文共 1493 字,大约阅读时间需要 4 分钟。

刚接触 树上背包。。有点抽象化 找好父亲和儿子的关系 及状态转移方程 

代码里有详细的注释  就不解释了

1 #include 
2 #include
3 #include
4 #include
5 #include
6 using namespace std; 7 #define N 155 8 #define INF 0xfffffff 9 int n,m;10 int w[N][N],o[N],dp[N][N];11 void add(int u,int v)12 {13 w[u][o[u]++] = v;//不在乎内存的邻接表14 }15 void dfs(int root)16 {17 int i,j;18 for(i = 0; i <= m ; i++)19 dp[root][i] = INF;//类似背包的初始化 20 dp[root][1] = 0;//如果保留一个节点 就不需要切 那个加1 会在后面有21 for(i = 0; i < o[root] ; i++)22 {23 int son = w[root][i];24 dfs(son);//搜到叶子 树都这样25 for(j = m ; j>=0 ; j--)26 {27 int minz = INF,k;28 for(k = 0 ; k < j ; k++)29 minz = min(minz,dp[root][k]+dp[son][j-k]);//这个是对于本儿子来言 找一个能够让父亲保留J个节点的最好办法30 dp[root][j] = min(dp[root][j]+1,minz);//是保留之前j个节点的取法(就是不要本儿子 切掉) 还是要本儿子的方法31 }32 }33 }34 int main()35 {36 int i;37 while(scanf("%d",&n)!=EOF)38 {39 memset(o,0,sizeof(o));40 scanf("%d",&m);41 for(i = 1; i < n ;i++)42 {43 int u,v;44 scanf("%d%d",&u,&v);45 add(u,v);46 }47 dfs(1);48 int ans = dp[1][m];//树根的话就不用加切祖先那一刀了49 for(i = 2; i <= n ; i++)50 ans = min(ans,dp[i][m]+1);//剩下的都要+151 cout<
<
View Code

 

转载于:https://www.cnblogs.com/shangyu/p/3279480.html

你可能感兴趣的文章
链路追踪工具之Zipkin学习小记
查看>>
iOS中通讯录的开发
查看>>
怎么让table中的<td>内容向上对齐
查看>>
[Java] 遍历HashMap和HashMap转换成List的两种方式
查看>>
mongodb
查看>>
LeetCode 46. Permutations
查看>>
jmeter- 性能测试3:聚合报告(Aggregate Report )
查看>>
JavaScript高级程序设计---学习笔记(二)
查看>>
vim 插件的学习
查看>>
Uncaught SyntaxError: Unexpected token ILLEGAL
查看>>
一个预处理定义的问题
查看>>
神经网路-SGD-1
查看>>
安卓冷知识:LayoutParams
查看>>
JAVA操作mysql(如何更加面向对象的操作数据库)
查看>>
Python9-事件及队列-day37
查看>>
团队作业3
查看>>
2.5.2 优先队列
查看>>
Linux下配置c/c++编译环境-Emacs-转载博客园
查看>>
Jmeter将HTTP request报文体中的字符串转换为大写
查看>>
UVa 11572 - Unique Snowflakes (set+滑动窗口思想)
查看>>