hdu 4003 Find Metal Mineral

原创 2016年01月26日 15:05:03

描述:

给定一个有n个节点带边权的树,在S点放置K个机器人,问让机器人遍历所有边的最小花费。

分析:

这题简直把我智商给藐视了,一开始我思路完全错了QAQ。。。被卡了半下午

这题难点在于处理机器人进入子树然后回溯的情况,实际上回溯的过程是有一些性质可循的。如果最终状态的子树中有机器人,那么是没有必要再让其他的机器人进入子树再离开子树。我们完全可以让子树中的机器人走一遍准备进入子树再离开的机器人的路径(进入再回到i点),然后从i点继续走自己原本的路径。这样可以省去进出子树的那条边的花费。只有当子树中最终没有机器人,我们才需要回溯。这种情况下会把子树中的每条边都走两遍,只需要一个机器人去回溯就可以了,这样可以最小化进入子树的花费。

我们令dp[i][j]表示以i为根节点的子树中,最终放j个机器人所对应的最小花费。当j=0,则:dp[i][j]=2*子树内总边权。我们把机器人的数目看做容量,花费看做代价,每个子树要么是dp[i][0]+2*w(w为进入子树的那条边的边权,2表示一进一出,容量为0),要么是dp[i][j]+j*w(j个机器人,只进不出,容量为j)。这就是一个分组(每个子树就是一个组)的01背包问题。

代码:

#include<cstdio>
#include<cstring>
using namespace std;
#define N 10005
#define min(x,y) (x<y?x:y)
struct Edge{
    int to,w,next;
};
Edge edge[N<<1];
int dp[N][15],head[N],cnt,S,K,n;
void addedge(int u,int v,int w){
    edge[cnt].to=v;edge[cnt].w=w;
    edge[cnt].next=head[u];head[u]=cnt++;
}
void dfs(int u,int fa){
    int v;
    for(int i=0;i<=K;++i) dp[u][i]=0;
    for(int i=head[u];i!=-1;i=edge[i].next){
        if((v=edge[i].to)==fa) continue;dfs(v,u);
        for(int j=K;j>0;--j){
            dp[u][j]+=(dp[v][0]+2*edge[i].w);
            for(int l=1;l<=j;++l)
                dp[u][j]=min(dp[u][j],dp[u][j-l]+dp[v][l]+l*edge[i].w);
        }
        dp[u][0]+=(dp[v][0]+2*edge[i].w);
    }
}
int main(){
    int u,v,w;
    while(scanf("%d%d%d",&n,&S,&K)!=EOF){
        cnt=0;memset(head,-1,sizeof(head));
        for(int i=1;i<n;++i){
            scanf("%d%d%d",&u,&v,&w);
            addedge(u,v,w);addedge(v,u,w);
        }
        dfs(S,0);
        printf("%d\n",dp[S][K]);
    }
    return 0;
}


HDU 4003 Find Metal Mineral

HDU 4003 Find Metal Mineral 树形dp
  • u013351160
  • u013351160
  • 2014年07月03日 11:13
  • 550

hdu 4003 Find Metal Mineral

题目大意: 一些节点之间有道路相连,所有的节点和道路形成了一棵树。一共有 n 个节点,这些节点被编号为 1~n 。人类将 k 个机器人送上了火星,目的是采集这些金属。这些机器人都被送到了一个指定的着...
  • buctyyzyn
  • buctyyzyn
  • 2015年04月20日 17:43
  • 290

Hdu 4003 Find Metal Mineral 树型背包DP

Find Metal Mineral Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Other...
  • sinat_35406909
  • sinat_35406909
  • 2017年08月09日 21:06
  • 71

hdu 4003 Find Metal Mineral (树形dp)

Find Metal Mineral Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Othe...
  • u010228612
  • u010228612
  • 2014年03月15日 17:03
  • 750

hdu 4003 Find Metal Mineral (树形背包dp)

题意 给一棵n个节点的树, 节点编号为1~n, 每条边都有一个花费值. 有k个机器人从S点出发, 问让机器人遍历所有边,最少花费值多少? 思路 很好的一题, 推荐! ...
  • shuangde800
  • shuangde800
  • 2013年08月24日 00:30
  • 2321

HDU 4003 Find Metal Mineral 树形DP

题意:人类在火星上发现一个金属矿。金属矿的道路是个树形的。在每个叶子节点有矿。现在从根结点S派出K个机器人,去取所有叶子节点的矿,希望所有机器人走的距离之和最短。 思路:通过模拟可以发现,影响状态的...
  • u012139398
  • u012139398
  • 2015年02月22日 10:37
  • 355

hdu 4003 Find Metal Mineral 树形DP

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4003 题意:有n个矿,矿之间有n-1条路,每条路有相应花费。有k个机器人,从s点出发,求遍历每个矿的...
  • zchahaha
  • zchahaha
  • 2016年05月12日 22:23
  • 353

HDU - 4003 Find Metal Mineral(动态规划)

Find Metal Mineral Time Limit: 1000MS   Memory Limit: 65768KB   64bit IO Format: %I64d & %I64u ...
  • qq_18738333
  • qq_18738333
  • 2015年03月31日 21:09
  • 347

HDU 4003 Find Metal Mineral (树形dp)

Find Metal Mineral Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Other...
  • liangzhaoyang1
  • liangzhaoyang1
  • 2016年10月15日 22:50
  • 344

HDOJ 4003 Find Metal Mineral

题意: 一棵有权树,从根结点中放入 K 个机器人,求用这 K 个机器人遍历所有的结点最少的权值和。 思路: 1. dp[u][i] 表示给以 u 为根节点的子树放 i 个机器人,遍历...
  • u012797220
  • u012797220
  • 2014年08月10日 10:07
  • 1030
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu 4003 Find Metal Mineral
举报原因:
原因补充:

(最多只允许输入30个字)