HDU 4003 Find Metal Mineral(树形dp,从根节点出发k个机器人遍历所有边的最小代价和)

原创 2016年08月08日 20:43:13

题目链接;
HDU 4003 Find Metal Mineral
题意:
给一个n个节点和n1条边的树,每条边有权值,在给定的根节点rootK个机器人,要用这K个机器人从根节点出发遍历所有的边,求最小代价?代价就是经过的所有边的权值和,机器人不必最终都回到根节点,机器人也可以重复走一些边。
数据范围:n104,k10
分析;
树形dp。
其实,我觉得能够定义合适的状态,问题就解决了一半了。
因为一个机器人遍历完一颗子树可能返回到父亲节点,所以我定义dp[u][i]表示遍历完以u为根的子树的所有边时使用i个机器人并且这i个机器人都不回到u的最小代价(不会再在遍历别的子树时被使用)。
但是要考虑到可能对于一颗子树他独自用到的机器人是0个,其实这就可以用dp[u][0]表示了。在这种情况下会有几个机器人进去呢?答案是进去一个是最优的,因为有p个机器人进去又出来的话,在父亲与儿子的边上走了p2遍,但是在儿子子树的内部的花费都是一样的,都是边权和乘以2,,所以进去一个机器人是最优的。
接下来考虑状态转移。我们对于节点u遍历它的每一个儿子v,我们用类似滚动数组的方法(?)滚动记录dp[u][i]的最优解,用cost表示父亲u和儿子v之间的边权。
首先从dp[v][0]转移:

dp[u][i]=dp[u][i]+dp[v][0]+cost2

枚举v消耗了j个机器人:
dp[u][i]=min(dp[u][i],dp[u][ij]+dp[v][j]+jcost)

需要注意iK0枚举,j从1到i枚举,并且先dfs再枚举。
答案就是dp[root][k]
时间复杂度:O(nK2)

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
typedef long long ll;
const int MAX_N = 10010;
const int MAX_K = 15;

int n, root, total, K;
int head[MAX_N];
ll dp[MAX_N][MAX_K];

struct Edge {
    int v, w, next;
}edge[MAX_N * 2];

void AddEdge(int u, int v, int w)
{
    edge[total].v = v;
    edge[total].w = w;
    edge[total].next = head[u];
    head[u] = total++;
}

void wyr(int u, int p)
{
    for (int id = head[u]; id != -1; id = edge[id].next) {
        int v = edge[id].v, w = edge[id].w;
        if (v == p) continue;
        wyr(v, u);
        for (int i = K; i >= 0; --i) {
            dp[u][i] += dp[v][0] + 2 * w;
            for (int j = 1; j <= i; ++j) {
                dp[u][i] = min(dp[u][i], dp[v][j] + dp[u][i - j] + j * w);
            }
        }
    }
}

int main()
{
    while (~scanf("%d%d%d", &n, &root, &K)) {
        memset(head, -1, sizeof(head));
        total = 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);
        }
        memset(dp, 0, sizeof(dp));
        wyr(root, -1);
        printf("%lld\n", dp[root][K]);
    }
    return 0;
}
版权声明:缥缈玉京人,想语然、京兆眉妩。

HDU 4003 Find Metal Mineral(树形dp,从根节点出发k个机器人遍历所有边的最小代价和)

题目链接; HDU 4003 Find Metal Mineral 题意: 给一个nn个节点和n−1n-1条边的树,每条边有权值,在给定的根节点rootroot有KK个机器人,要用这KK个机器...
  • Ramay7
  • Ramay7
  • 2016年08月08日 20:43
  • 468

算法提高 金属采集

问题描述 人类在火星上发现了一种新的金属!这些金属分布在一些奇怪的地方,不妨叫它节点好了。一些节点之间有道路相连,所有的节点和道路形成了一棵树。一共有 n 个节点,这些节点被编号为 1~n 。人类将...
  • qq_36183935
  • qq_36183935
  • 2017年04月02日 23:17
  • 245

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)

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

树形dp--清洁机器人 nkoj3695

P3695清洁机器人 时间限制 : - MS   空间限制 : 65536 KB   评测说明 : 时限1000ms 问题描述 NK中学有n间教室(编号1到n),通过n-1条双向道路相连,每条道...
  • INCINCIBLE
  • INCINCIBLE
  • 2016年06月20日 19:30
  • 407

HDU 4313 Matrix (贪心)

题目地址:HDU 4313 利用最小生成树的思想,这里是从大往下删,能删则删,不能删就留着。用个并查集维护下。代码如下:#include #include #include #include ...
  • u013013910
  • u013013910
  • 2015年10月30日 16:15
  • 322

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
  • 352

机器人树上寻宝

给出一棵树,树上的每个节点都有权值。可以从树上任选一点,放出k个机器人,每个机器人最多走过m-1条边。要求停留的点权值和最大。 动态规划算法。归并思想,归并的同时排好序。 枚举步数从1到k.访问每...
  • shenyuedong123
  • shenyuedong123
  • 2017年06月23日 19:20
  • 114

hdu4044GeoDefense 树形dp+分组背包

//在一颗树上每个点建炮台, //每个点都有不同价格和威力的炮台选择,每个点只能建一个炮台 //敌人从树根1点出发,走出叶子节点玩家就输了,对于每一个节点,敌人走哪一个子节点不确定 //问给m块钱,问...
  • cq_pf
  • cq_pf
  • 2015年07月31日 09:50
  • 248
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU 4003 Find Metal Mineral(树形dp,从根节点出发k个机器人遍历所有边的最小代价和)
举报原因:
原因补充:

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