首页 > 其他 > 详细

poj 1947(树形dp)

时间:2014-05-05 23:46:33      阅读:434      评论:0      收藏:0      [点我收藏+]

题意:一棵树上问你最少切掉几条边使得能分割出一个结点数正好为k的子树。

思路:dp[i][j]表示以i为根切掉j个结点最少要几条边。

dp[v][j] = min(dp[v][j], dp[v][j-k] + dp[x][k]);

代码如下:

bubuko.com,布布扣
 1                         dp[v][j] = min(dp[v][j], dp[v][j-k] + dp[x][k]);
 2                     }
 3                 }
 4             }
 5         }
 6     }
 7     return vex[v];
 8 }
 9 
10 int main()
11 {
12 //    freopen("in.txt","r",stdin);
13     //freopen("out.txt","w",stdout);
14 
15     int a, b;
16     while(cin >> n >> m){
17         init();
18         for(int i=0; i<n-1; i++){
19             cin >> a >> b;
20             a--,b--;
21             Map[a].PB(b);
22             ind[b] ++;
23         }
24         int rt;
25         for(int i=0; i<n; i++){
26             if(!ind[i]) rt = i;
27         }
28         dfs(rt, -1);
29         int ans = INF;
30         for(int i=0; i<n; i++){
31             if(i!=rt)ans = min(ans, dp[i][vex[i]-m]+1);
32             else ans = min(ans, dp[i][vex[i]-m]);
33         }
34         cout << ans << endl;
35     }
36     return 0;
37 }
View Code

 

poj 1947(树形dp),布布扣,bubuko.com

poj 1947(树形dp)

原文:http://www.cnblogs.com/shu-xiaohao/p/3704557.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!