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 ...
随机推荐
- CenterOS 7安装Nginx
1.wget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm下载对 ...
- httpclient get/post请求
public static String httpPost(String url, JSONObject json) { String respContent = null; try{ HttpPos ...
- ivew url 的输入
1. <FormItem label="链接" prop="url"> <Input v-model="formValidate.u ...
- List和Tuple的中的method对比
- TCC、XA 、DTP区别
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11623047.html TCC的优缺点 优点 解决了跨服务的业务操作原子性问题,例如组合支付.下订单减 ...
- favicon.ico设置
<link rel="shortcut icon" href="media/image/favicon.ico" />
- pycharm之black配置for python file(代码格式化工具)
一.介绍下black 源码;https://github.com/ambv/blackpei 二.具体步骤 第一步 安装black: 从命令行安装:例如Windows的cmd窗口,运行命令pip3 i ...
- vector内存增长方式
首先必须要了解vector是一种特殊的数组,因此其内存必然是连续的 其次它的连续是建立在不断地对内存的预分配上的,即不断地销毁当前,重新建立内存,效率有点低.所以存在几个函数capacity, siz ...
- PHP curl_copy_handle函数
curl_copy_handle — 复制一个cURL句柄和它的所有选项 说明 resource curl_copy_handle ( resource $ch ) 复制一个cURL句柄并保持相同的选 ...
- Codeforces 837D--Round Subset (DP)
原题链接:http://codeforces.com/contest/837/problem/D 题意:在n个数字中,取k个数,使这些数的乘积后缀“0”的个数最大,输出后缀0的最大数量. 思路:显然只 ...