HDU-4003 Find Metal Mineral 树形DP (好题)
题意:给出n个点的一棵树,有k个机器人,机器人从根节点rt出发,问访问完整棵树(每个点至少访问一次)的最小代价(即所有机器人路程总和),机器人可以在任何点停下。
解法:这道题还是比较明显的能看出来是树形DP,然后分配机器人肯定想到树形分组背包DP。那么dp方程和常规树形背包dp一样很容易些 dp[x][i]=min(dp[x][i],dp[y][j]+val(y,j)+dp[x][i-j]) 代表总共i个机器人给当前子树y分配j个机器人剩下的i-j个机器人分配给前几棵子树的最小代价。主要问题就是转移代价怎么写?明显如果机器人数量>=叶子结点数量就直接每个叶子派一个就行,否则必须得重复使用。仔细观察得到其实只要特殊处理派机器人为0的情况就行,派机器人>0的直接dp,且容易得到派机器人为0就是的代价就是 子树大小*2 (因为要从分叉点进去访问这棵子树之后再回到这个分叉点,画图很容易理解)。所以特殊处理机器人=0,其他代价就是dp[y][j]+j*w。有点绕,配合代码看会容易理解一些。
总的来说,这是一道好题,不容易想很锻炼思维(至少对博主来说是这样)。
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+;
int n,m,rt;
int siz[N],dp[N][],tmp[]; int cnt,head[N],nxt[N<<],to[N<<],len[N<<];
void add_edge(int x,int y,int z) {
nxt[++cnt]=head[x]; to[cnt]=y; len[cnt]=z; head[x]=cnt;
} int calc(int y,int k,int i) {
if (k==) return dp[y][k]+*len[i]; else return dp[y][k]+k*len[i];
} void dfs(int x,int fa) {
siz[x]=;
bool ok=;
memset(dp[x],0x3f,sizeof(dp[x])); dp[x][]=;
for (int i=head[x];i;i=nxt[i]) {
int y=to[i];
if (y==fa) continue;
dfs(y,x); ok=;
siz[x]+=siz[y]+len[i];
memcpy(tmp,dp[x],sizeof(dp[x]));
memset(dp[x],0x3f,sizeof(dp[x]));
for (int j=m;j;j--)
for (int k=;k<=j;k++) //给子节点y分配k个机器人
dp[x][j]=min(dp[x][j],calc(y,k,i)+tmp[j-k]);
dp[x][]=*siz[x];
}
if (ok) memset(dp[x],,sizeof(dp[x]));
} int main()
{
while (scanf("%d%d%d",&n,&rt,&m)==) {
cnt=; for (int i=;i<=n;i++) head[i]=;
for (int i=;i<n;i++) {
int x,y,z; scanf("%d%d%d",&x,&y,&z);
add_edge(x,y,z);
add_edge(y,x,z);
}
dfs(rt,);
int ans=0x3f3f3f3f;
for (int i=;i<=m;i++) ans=min(ans,dp[rt][i]);
printf("%d\n",ans);
}
return ;
}
HDU-4003 Find Metal Mineral 树形DP (好题)的更多相关文章
- hdu 4003 Find Metal Mineral 树形DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4003 Humans have discovered a kind of new metal miner ...
- hdu 4003 Find Metal Mineral 树形dp ,*****
Find Metal Mineral Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Other ...
- HDU 4003 Find Metal Mineral(分组背包+树形DP)
题目链接 很棒的一个树形DP.学的太渣了. #include <cstdio> #include <string> #include <cstring> #incl ...
- HDU4003Find Metal Mineral[树形DP 分组背包]
Find Metal Mineral Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Other ...
- HDU4003 Find Metal Mineral 树形DP
Find Metal Mineral Problem Description Humans have discovered a kind of new metal mineral on Mars wh ...
- HDU 4003 Find Metal Mineral (树形DP,经典)
题意:给定一棵树图,n个节点,有边权,要派k<11个机器人从节点s出发,遍历所有的点,每当1只机器人经过1条边时就会花费该边的边权,边是可重复走的.问遍历完所有点的最小花费? 思路: 非常经典, ...
- hdu4003Find Metal Mineral(树形DP)
4003 思维啊 dp[i][j]表示当前I节点停留了j个机器人 那么它与父亲的关系就有了 那条边就走了j遍 dp[i][j] = min(dp[i][j],dp[child][g]+dp[i][j- ...
- HDU 4003 Find Metal Mineral
这个题是POJ1849的加强版. 先说一个很重要的结论,下面两种方法都是从这个结论出发的. 一个人从起点遍历一颗树,如果最终要回到起点,走过的最小权值就是整棵树的权值的2倍. 而且K个人的情况也是如此 ...
- hdu 4514 并查集+树形dp
湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
随机推荐
- Java虚拟机(JVM)与垃圾回收机制(GC)的详解
一.JVM结构 根据<java虚拟机规范>规定,JVM的基本结构一般如下图所示: 从左图可知,JVM主要包括四个部分: 1.类加载器(ClassLoader):在JVM启动时或者在类运行时 ...
- Go 查找
sort.SearchInts(a []int, b int) 从数组a中查找b,前提是a必须有序 sort.SearchFloats(a []float64, b float64) 从数组a中查找b ...
- vuex的配置使用
为什么使用vuex? vuex主要是是做数据交互,父子组件传值可以很容易办到,但是兄弟组件间传值(兄弟组件下又有父子组件),或者大型spa单页面框架项目,页面多并且一层嵌套一层的传值,异常麻烦,用vu ...
- 【挖坟】HDU3205 Factorization
分圆多项式 问题在于精度貌似出了一些奇怪的问题... [输出也写的有问题QAQ] 完全不会处理了 加上全网没有题解T^T 挖个坑以后补.. #include<cstdio> #includ ...
- centos 6.5 解压 tar.gz
只查看 tar.gz 文件内容而不解压 tar -tvf filename.tar.gz 解压为 tar 文件 gzip -d filename.tar.gz 解压为文件或目录 tar xvf fil ...
- 解决swagger跨项目或跨程序集注释不显示问题
背景 我们在使用Swagger生成.NET Core Web Api 项目接口文档时候,发现接口的入参和出参的注释是看不见的,如下: 但是我想要结果是这样: 原因分析以及方案 为什么没有显示注释呢,注 ...
- FMXUI TEXTVIEW代码设置IMAGEINDEX
FMXUI作为一个开源的控件,真是DELPHIER的福音,向作者致敬.TEXTVIEW非常好用,在属性面板中有ImageIndex属性,可以方便设置图标,在实际应用中图标状态需要改变,但在代码设置时 ...
- CF 1172E Nauuo and ODT ——LCT
题目:http://codeforces.com/contest/1172/problem/E LCT好题. 考虑对每个颜色求出 “不是该颜色的点组成的连通块的 siz2 之和” .每个颜色用 LCT ...
- RHEL/CentOS通用性能优化、安全配置参考
RHEL/CentOS通用性能优化.安全配置参考 本文的配置参数是笔者在实际生产环境中反复实践总结的结果,完全适用绝大多数通用的高负载.安全性要求的网络服务器环境.故可以放心使用. 若有异议,欢迎联系 ...
- C# foreach和for比较
foreach优点: 1.语句更简洁 2.不需要强制类型转换(比如输出的时候要进行一下乘运算) 3.多维数组遍历只需一行代码 4.不用对索引进行检查 缺点: 1.不能对数据进行修改 参考:https: ...