Let's imagine how apple tree looks in binary computer world. You're right, it looks just like a binary tree, i.e. any biparous branch splits up to exactly two new branches. We will enumerate by integers the root of binary apple tree, points of branching and the ends of twigs. This way we may distinguish different branches by their ending points. We will assume that root of tree always is numbered by 1 and all numbers used for enumerating are numbered in range from 1 to N, where N is the total number of all enumerated points. For instance in the picture below N is equal to 5. Here is an example of an enumerated tree with four branches:
  1. 2 5
  2. \ /
  3. 3 4
  4. \ /
  5. 1
As you may know it's not convenient to pick an apples from a tree when there are too much of branches. That's why some of them should be removed from a tree. But you are interested in removing branches in the way of minimal loss of apples. So your are given amounts of apples on a branches and amount of branches that should be preserved. Your task is to determine how many apples can remain on a tree after removing of excessive branches.

Input

First line of input contains two numbers: N and Q (2 ≤ N ≤ 100; 1 ≤ Q ≤ N − 1). N denotes the number of enumerated points in a tree. Q denotes amount of branches that should be preserved. NextN − 1 lines contains descriptions of branches. Each description consists of a three integer numbers divided by spaces. The first two of them define branch by it's ending points. The third number defines the number of apples on this branch. You may assume that no branch contains more than 30000 apples.

Output

Output should contain the only number — amount of apples that can be preserved. And don't forget to preserve tree's root ;-)
 
题目大意:有一颗以1为根的二叉树,有n个点,每条边有一个边权,问保留Q条边,如何使这Q条边边权和最大,注意这Q条边必须连着点1。
思路:可以参考2009年IOI的论文《浅谈几类背包问题》,复杂度为O(NQ)。
 
代码(31ms):
  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <iostream>
  4. #include <cstring>
  5. using namespace std;
  6.  
  7. const int MAXN = ;
  8.  
  9. int head[MAXN], ecnt;
  10. int to[MAXN << ], next[MAXN << ], weight[MAXN << ];
  11. int dp[MAXN][MAXN];
  12. int n, m;
  13.  
  14. void init() {
  15. memset(head, -, sizeof(head));
  16. ecnt = ;
  17. }
  18.  
  19. void add_edge(int u, int v, int c) {
  20. to[ecnt] = v; weight[ecnt] = c; next[ecnt] = head[u]; head[u] = ecnt++;
  21. to[ecnt] = u; weight[ecnt] = c; next[ecnt] = head[v]; head[v] = ecnt++;
  22. }
  23.  
  24. inline void update_max(int &a, int b) {
  25. if(a < b) a = b;
  26. }
  27.  
  28. void dfs(int f, int u, int C) {
  29. for(int p = head[u]; ~p; p = next[p]) {
  30. int &v = to[p];
  31. if(v == f) continue;
  32. for(int i = ; i <= C - ; ++i) dp[v][i] = dp[u][i] + weight[p];
  33. dfs(u, v, C - );
  34. for(int i = ; i <= C; ++i)
  35. update_max(dp[u][i], dp[v][i - ]);
  36. }
  37. }
  38.  
  39. int main() {
  40. scanf("%d%d", &n, &m);
  41. init();
  42. for(int i = ; i < n; ++i) {
  43. int u, v, c;
  44. scanf("%d%d%d", &u, &v, &c);
  45. add_edge(u, v, c);
  46. }
  47. dfs(, , m);
  48. printf("%d\n", dp[][m]);
  49. }

URAL 1018 Binary Apple Tree(树DP)的更多相关文章

  1. CJOJ 1976 二叉苹果树 / URAL 1018 Binary Apple Tree(树型动态规划)

    CJOJ 1976 二叉苹果树 / URAL 1018 Binary Apple Tree(树型动态规划) Description 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的 ...

  2. ural 1018 Binary Apple Tree(树形dp | 经典)

    本文出自   http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ...

  3. Ural 1018 Binary Apple Tree

    题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1018 Dynamic Programming. 首先要根据input建立树形结构,然后在 ...

  4. URAL1018 Binary Apple Tree(树dp)

    组队赛的时候的一道题,那个时候想了一下感觉dp不怎么好写呀,现在写了出来,交上去过了,但是我觉得我还是应该WA的呀,因为总感觉dp的不对. #pragma warning(disable:4996) ...

  5. timus 1018. Binary Apple Tree

    1018. Binary Apple Tree Time limit: 1.0 secondMemory limit: 64 MB Let's imagine how apple tree looks ...

  6. Ural-1018 Binary Apple Tree(树形dp+分组背包)

    #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #i ...

  7. URAL_1018 Binary Apple Tree 树形DP+背包

    这个题目给定一棵树,以及树的每个树枝的苹果数量,要求在保留K个树枝的情况下最多能保留多少个苹果 一看就觉得是个树形DP,然后想出 dp[i][j]来表示第i个节点保留j个树枝的最大苹果数,但是在树形过 ...

  8. BNUOJ 13358 Binary Apple Tree

    Binary Apple Tree Time Limit: 1000ms Memory Limit: 16384KB This problem will be judged on Ural. Orig ...

  9. POJ 3321 Apple Tree(树状数组)

                                                              Apple Tree Time Limit: 2000MS   Memory Lim ...

随机推荐

  1. Unix网络编程(迭代服务器)

    #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/soc ...

  2. [LeetCode]题解(python):031-Next Permutation

    题目来源 https://leetcode.com/problems/next-permutation/ Implement next permutation, which rearranges nu ...

  3. select下拉框美化

      其实用下列CSS就可以解决,原理是将浏览器默认的下拉框样式清除,然后应用上自己的,再附一张向右对齐小箭头的图片即可. select { /*Chrome和Firefox里面的边框是不一样的,所以复 ...

  4. js 事件监听封装

    var eventUtil={//添加句柄 //element,节点 //type,事件类型 //handler,函数 addHandler:function(element,type,handler ...

  5. C#反射代码

    Object model=Assembly.Load(“程序集”).CreateInstance(命名空间.类名); object obj2 = Type.GetType("MyClass& ...

  6. saltstack之(九)配置管理源码部署Nginx

    场景:rpm包安装的nginx服务,无法满足定制模块的需求,故线上环境使用nginx源码进行安装.本片文章详细介绍如何使用saltstack的配置管理功能实现nginx软件的源码安装. 下载源码:pc ...

  7. marathon参考(11):ports端口设置(转)

    Ports marathon中应用的端口配置可能被混淆,并有一个悬而未决的问题,需要重新设计 ports API.这个页面试图更清楚地解释它们是如何工作的. 定义 containerPort:在容器内 ...

  8. mysql 授权 user@'%' 为什么登陆的时候localhost 不行呢???

    公司业务服务器还没迁移到阿里云上的时候,创建的一个用户明明是所有的,但是本机登陆就是不行,一直也搞不懂原因 今天才知道 原来 %不包括 localhost mysql> grant all on ...

  9. 单臂路由+DHCP+VLAN

    使用思科模拟软件Cisco Packet Tracer Student,软件功能有限,只能架设简单的网络架构,适合初学者使用.

  10. Oracle 10046 trace文件分析

    生成10046 trace文件: SQL> create table t10046 as select * from dba_objects; Table created. SQL> se ...