hdu 4003

树形DP ———— 【HDU4003】 Find Metal Mineral 给一棵n个节点的树, 节点编号为1~n, 每条边都有一个花费值。有k个机器人从s点出发, 问让机器人遍历所有边,最少花费值多少? 阅读详情

http://acm.hdu.edu.cn/showproblem.php?pid=4003

这题是比较好的树形dp题,dp[root][k] 表示派了k个机器人遍历了以root为根的树的最小代价,特殊的dp[root][0]表示派了一个机器人遍历后又回到root的最小代价

参考了  http://hi.baidu.com/dashi_h/blog/item/20dfb61cd8a4e10a6159f340.html



#include <cstdlib>
#include <iostream>

using namespace std;
const int N=100005;

int f[N][15],n,s,k;
struct Node
{
   int v,cost,nt;
}e[20010];
int h[N],id;
void addedge(int u,int v,int c)
{
   e[id].cost=c;
   e[id].v=v;
   e[id].nt=h[u];
   h[u]=id++;
}
void dfs(int root,int p)
{
    for(int i=h[root];i!=-1;i=e[i].nt)
    {
        int v=e[i].v;
        if(v==p) continue;
        dfs(v,root);
        for(int j=k;j>=0;j--)
        {
           f[root][j]=f[root][j]+2*e[i].cost+f[v][0];//如果派了一个机器人在遍历完v子树后返回到root节点要特殊处理下
           for(int t=1;t<=j;t++)
           {
               int tp=f[root][j-t]+f[v][t]+t*e[i].cost;
               if(tp<f[root][j]) f[root][j]=tp;
           }
        }
    }
}
int main(int argc, char *argv[])
{
    while(scanf("%d%d%d",&n,&s,&k)==3)
    {
       memset(f,0,sizeof(f));
       memset(h,-1,sizeof(h));
       id=0;
       for(int i=0;i<n-1;i++)
       {
          int a,b,c;
          scanf("%d%d%d",&a,&b,&c);
          addedge(a-1,b-1,c);
          addedge(b-1,a-1,c);
       }
       dfs(s-1,-1);
       printf("%d\n",f[s-1][k]);
    }
    return EXIT_SUCCESS;
}


HDU4003(Find Metal Mineral 树形dp) 题目 挺好的一道题。 最终状态 这颗子树没有机器人,遍历完离开了,那么一定是1个机器人去完成这颗子树的遍历过程的。所以下面第24行代码里才会有 +2* w; x是由他的每个子树y1 y2 y3…转移过来的,每个子树所有点都要遍历,所以每个子树都一定要选一个。 dp[x][j]:最后状态 (x的子树以及x本身)共有j个机器人停留在里面。 每到一个儿子y的时候。就是分成k k->[1,j]个机器... 阅读详情

相关推荐

HDU 4003 (树形DP + 分组背包)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4003 题意:求K个机器人从同一点出发,遍历所有点所需的最小花费 思路:转自kuangbin大神博客:http://www.cnblogs.com/kuangbin/archive/2012/08/29/2661928.html dp[i][j]表示对于以i结点为根结点的子...

Tongqi 772

HDU 4003 树形DP+背包

题意给一棵树,一堆机器人从根节点向下进行搜索。要求搜索到每个叶子节点,机器人可以向回走。问机器人行走最短总路径和是多少。题解树形DP+背包,不过不能算是严谨的背包。DP方程不太好想,dp[i][j]代表i点有j个机器人走了便不再回来。DP分两步,第一步是假设所有的机器人走了以后都会回来,dp[s][j]+=dp[nd.to][0]+2*nd.val。第二步是派一部分机器人走下去便不用回来,dp[s]

zhenlingcn的博客 308

hdu4003详解(树形dp+多组背包)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4003 Find Metal Mineral Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 65768/65768 K (Java/Others)Total Submission(s): 4490Accepted Sub...

weixin_30378311的博客 216

HDU 4003 Find Metal Mineral【经典树形DP背包】

HDU - 4003传送门 题意:给出结点数n,起点s,机器人数k,然后n-1行给出相互连接的两个点,还有这条路线的价值,要求最小花费 分析:这是我从别人博客里找到的解释,因为很详细就引用了, dp[i][j]表示对于以i结点为根结点的子树,放j个机器人所需要的权值和 当j=0时表示放了一个机器人下去,遍历完结点后又回到i结点了。状态 转移方程类似背包如果最终的状态中以i为根结点

tystrwor的博客 395

hdu 4003(树形dp)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4003 思路:dp[i][j]表示以i为根选择j个机器人的最小花费,然后就是背包了:dp[u][i]=min(dp[u][i],dp[u][i-j]+dp[v][j]+j*w)(1 1 #include 2 #include 3 #include 4 #include 5

几百个教授的专栏 376

hdu 4003

地址:http://acm.hdu.edu.cn/showproblem.php?pid=4003 参见大牛的博客吧http://blog.csdn.net/woshi250hua/article/details/7648099 mark:写一点我的总结。     因为该题题目要求的是每个点都必须至少走一次。状态我自己是没想出来,根据大牛的状态。dp[v][0]可以理解为一个机器人跑以v为根...

weixin_30336061的博客 94

hdu 4003 Find Metal Mineral 树形DP

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4003 题意:有n个矿,矿之间有n-1条路,每条路有相应花费。有k个机器人,从s点出发,求遍历每个矿的最小花费。 对于一个根节点s,如果机器人足够遍历所有的子树,可以看做常规的树状dp,分配c个机器人去遍历子树,求最优解。 如果机器人不够时,那么就从别的子树那里借一些机器人,从根节点出法,

弱菜zc 716

HDU 4003:Find Metal Mineral 树形DP+分组背包

Find Metal Mineral 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4003 题意: 有一棵树(存在N个节点),树上每条边都有权值,在其根节点S上有K个机器人,求这些机器人遍历所有点所花费的最小权值和 题解: 设dp[i][j]为以i为根节点的子树上有X个机器人的最小花费,按分组背包的思想跑一遍DP...

weixin_30235225的博客 157

hdu4003

/*依赖背包的通常做法就是对于每个结点,先处理处其所有子节点的dp,然后对于当前结点进行分组背包dp即可 还是依赖背包问题,dp[i][j]表示结点i的子树用了j个机器人的搜索代价 边界条件,如果某个结点的子树用了0个机器人,那么搜索这个棵子树的代价是边权和*2 将每个结点子树中的机器人看做物品体积,搜索代价看做价值,求最小价值 */ #include<bits/stdc++...

weixin_30338497的博客 186

HDU 4003——Find Metal Mineral【树形DP & 类树形背包变形】

题目传送门 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 ...

NIRVANA REBIRTH 538

hdu4003-树形dp

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4003 Description Humans have discovered a kind of new metal mineral on Mars which are distributed in point‐like with paths connecting ea...

测试 348

HDU 4003

一开始dp写出来了。。。结果初始化理解错了。。。 dp[i][j]表示对于以i结点为根结点的子树,放j个机器人出去不收回所需要的权值和。  当j=0时表示放了机器人下去收回来,这里网上说是放一个人下去一直不能理解,其实是可以放多个下去,这里表示放了机器人回来的权值和,但是权值和是一个人遍历的值; 比方说一个人遍历全部的点回到 i 和两个人分别遍历回来结果是一样的,可以理解为一个人下去一个

lyc 849
上一篇: hdu 3364
下一篇: 博弈专题
struggle_mind
博客等级 码龄14年 39粉丝 153原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值