hdu4003Find Metal Mineral 树形dp+分组背包

//k个机器人从一颗树的树根开始往下走,
//走树的每条边都要消耗能量,问这k个人最少花多少能量能遍历所有点
//dp[u][i] 表示以u点为根节点的子树用i个节点遍历最少需要多少能量
//当i = 0时表示有一个点遍历了这颗子树又返回上一个节点
#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
using namespace std ;
const int maxn = 10010 ;
const int inf = 0x3f3f3f3f;
int dp[maxn][60] ;
int head[maxn] ;
int nedge ;
int n , s , m;
struct Edge
{
    int v , w ;
    int next ;
}edge[maxn<<1] ;
void addedge(int u , int v , int w)
{
    edge[nedge].v = v ;
    edge[nedge].w = w;
    edge[nedge].next = head[u] ;
    head[u] = nedge++;
}
void dfs(int u , int pre)
{
    int flag = 0 ;
    for(int i = head[u] ;i != -1 ;i =edge[i].next)
    {
        int v = edge[i].v ;
        if(v == pre)continue ;
        dfs(v , u) ;
        int len = edge[i].w ;
        for(int j = m;j >= 0;j--)
        {
            int sum = inf ;
            for(int k = 0;k <= j;k++)
            {
                int tmp = (k == 0 ? 2*len : k*len);
                sum = min(sum , dp[u][j-k] + dp[v][k] + tmp) ;
            }
            dp[u][j] = sum;
        }
    }
}
int main()
{
  //freopen("in.txt" ,"r" , stdin) ;
    while(~scanf("%d%d%d" ,&n , &s , &m))
    {
        memset(head , -1 , sizeof(head)) ;
        memset(dp , 0 ,sizeof(dp)) ;
        nedge = 0 ;
        for(int i = 1;i < n;i++)
        {
            int u , v , w ;
            scanf("%d%d%d" , &u , &v , &w) ;
            addedge(u , v , w) ;
            addedge(v , u , w) ;
        }
        dfs(s,0) ;
        cout<<dp[s][m]<<endl;
    }
    return 0 ;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-27 11:03:56

hdu4003Find Metal Mineral 树形dp+分组背包的相关文章

hdu4003 树形dp+分组背包

http://acm.hdu.edu.cn/showproblem.php?pid=4003 Problem Description Humans have discovered a kind of new metal mineral on Mars which are distributed in point‐like with paths connecting each of them which formed a tree. Now Humans launches k robots on

HDU ACM 4044 GeoDefense -&gt;树形DP+分组背包

题意:地图是一个编号为1-n的节点的树,节点1是敌方基地,其他叶节点是我方基地.敌人基地会出来敌人,为了防止敌人攻进我方基地,我们可以选择造塔.每个节点只能造一个塔,节点i有ki种塔供选择,价值和攻击力为price_i, power_i,攻击力power_i是让敌人经过这个节点时让敌人的HP减少power_i点.因此从敌人基地到我方任意一个基地的路径,这条路径上所有塔的攻击力之和,就是这个基地的抵抗力. 敌人攻击路径不确定,为了保护我方所有基地,需要确定所有基地中抵抗力最低的一个.我方只有数量为

[P1273] 有线电视网 (树形DP+分组背包)

题意:给出一棵树,有边权,只有叶子节点有点权,求一个合法方案(选择走到哪几个叶子节点,且路径上的权值和 <= 要走到的叶子节点的点权和),使得选择的叶子节点数量尽量的多: 解法:树形DP+分组背包: 1.树形DP:这是一棵树,所以叫树形DP: 2.分组背包:在这里主要是运用到了它的思想:我们可以设 f[i][j],表示 i节点选择了 j个叶子节点的费用最大值:假设现在在 x节点,它的下面有 n个叶子节点(不是它的儿子),那么我们就要处理出它选 1,2,3,……,n 个叶子节点的情况,但是由于这是

POJ 2486 Apple Tree 树形DP+分组背包

链接:http://poj.org/problem?id=2486 题意:一棵(苹果)树,树上有N个结点(N<=100),起点是结点1.每个结点上有若干个苹果,我可以进行K步操作(K<=200),每次操作是从当前结点移动到相邻的结点,并且到了相邻的结点以后会吃掉上面的所有苹果并且苹果不再长出来,相邻是指两个结点之间有边相连.问在K步操作之后最多可以吃掉多少个苹果. 思路:刚入手的时候觉得是一般的树形背包问题,dp[i][j]代表的是以i为根的子树中走j个结点所能吃到的苹果数,来进行状态转移,但

hdu 4003 Find Metal Mineral 树形DP

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4003 Humans have discovered a kind of new metal mineral on Mars which are distributed in point‐like with paths connecting each of them which formed a tree. Now Humans launches k robots on Mars to collect

hdu4044 树形dp+分组背包

http://acm.hdu.edu.cn/showproblem.php?pid=4044 Problem Description Tower defense is a kind of real-time strategy computer games. The goal of tower defense games is to try to stop enemies from reaching your bases by building towers which shoot at them

HDU-1011 Starship Troopers (树形DP+分组背包)

题目大意:给一棵有根带点权树,并且给出容量.求在不超过容量下的最大权值.前提是选完父节点才能选子节点. 题目分析:树上的分组背包. ps:特判m为0时的情况. 代码如下: # include<iostream> # include<cstdio> # include<vector> # include<cstring> # include<algorithm> using namespace std; const int N=105; const

hdu 1561 树形dp+分组背包

题意:就是给定n个点,每个地点有value[i]的宝物,而且有的宝物必须是另一个宝物取了才能取,问取m个点可以获得的最多宝物价值. 一个子节点就可以返回m个状态,每个状态表示容量为j(j<=m)时选最多的宝物,而一个子节点中只可以选择一个状态进行转移,每个节点有若干个子节点,问题就转换为分组背包,几个子节点就是几个分组背包,体积是选几个地点,价值是宝物价值. 状态转移方程: dp[v][1] = Money[v]; (v为叶子节点)                    dp[v][j] = m

【P2015】二叉苹果树 (树形DP分组背包)

题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 现在这颗树枝条太多了,需要剪枝.但是一些树枝上长有苹果. 给定需要保留的树枝数量,求出最多能留住多少苹果. 输入输出格式 输入格式: 第1行2个数,N和Q(1<=Q<= N,1<N<=100). N表示树的结点数,Q表示要保留的树枝数量.接下来N-1行描述树枝的信息. 每行3个整数,前两个是它连接的结点的编号.第3个数是