题意:给定一棵树,边权表示通过此边的代价,给k个机器人,指定从点s出发,求遍历所有结点的最小代价和。

分析:设计状态时不难想到用dp[i][j]表示从结点 i 出发遍历以它为根的子树的最小代价,但是转移时就遇到麻烦了,考虑只给你 1 个机器人的时候,这时要遍历所有结点就必然要走回头路,如果我们对每个结点再增加一个信息,表示从 i 出发遍历以 i 为根的子树且最后回到 i 的最小代价,这样转移就好办了,对于每个结点,将 j 个机器人分配给它的所有子结点,若分配 0 个机器人,则表明要派一个机器人去,遍历完了又回到 i 。方便起见,就以dp[i][0]表示从 i 出发遍历完子树 i 又回到i的最小代价。

View Code

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 10010
#define M 11
int n,e,s,m;
int first[N],next[N<<1],v[N<<1],w[N<<1],d[N];
int dp[N][M];
void init()
{e=0;memset(first,-1,sizeof(first));memset(d,0,sizeof(d));memset(dp,0,sizeof(dp));
}
void add(int a,int b,int c)
{d[a]++;v[e]=b;w[e]=c;next[e]=first[a];first[a]=e++;
}
void dfs(int a,int fa)
{if(d[a]==1 && v[first[a]]==fa)  return;int i,j,k,b;for(i=first[a];~i;i=next[i]){b=v[i];if(b==fa)   continue;dfs(b,a);for(j=m;j>=0;j--){dp[a][j]+=dp[b][0]+2*w[i];for(k=1;k<=j;k++){dp[a][j]=min(dp[a][j],dp[a][j-k]+dp[b][k]+k*w[i]);}}}
}
int main()
{int a,b,c;while(~scanf("%d%d%d",&n,&s,&m)){init();for(int i=1;i<n;i++){scanf("%d%d%d",&a,&b,&c);add(a,b,c);add(b,a,c);}dfs(s,0);printf("%d\n",dp[s][m]);}return 0;
}

转载于:https://www.cnblogs.com/algorithms/archive/2012/09/17/2689010.html

HDOJ 4003 Find Metal Mineral (树DP)相关推荐

  1. HDU 4003 Find Metal Mineral

    这个题是POJ1849的加强版. 先说一个很重要的结论,下面两种方法都是从这个结论出发的. 一个人从起点遍历一颗树,如果最终要回到起点,走过的最小权值就是整棵树的权值的2倍. 而且K个人的情况也是如此 ...

  2. [BZOJ2125]最短路(圆方树DP)

    题意:仙人掌图最短路. 算法:圆方树DP,$O(n\log n+Q\log n)$ 首先建出仙人掌圆方树(与点双圆方树的区别在于直接连割边,也就是存在圆圆边),然后考虑点u-v的最短路径,显然就是:在 ...

  3. 【BZOJ1040】【codevs1423】骑士,第一次的基环外向树DP

    传送门1 传送门2 思路: 好题 比较简单的DP思路 之前没写过基环树DP,第一次搞真心orz 我们发现这些元素是具有从属关系的 也就是说如果对"厌恶的骑士"两两相互连边,那么问题 ...

  4. 51nod1812树的双直径(换根树DP)

    传送门:http://www.51nod.com/Challenge/Problem.html#!#problemId=1812 题解:头一次写换根树DP. 求两条不相交的直径乘积最大,所以可以这样考 ...

  5. HDOJ 5087 Revenge of LIS II DP

    HDOJ 5087 Revenge of LIS II DP DP的时候记录下能否够从两个位置转移过来. ... Revenge of LIS II Time Limit: 2000/1000 MS ...

  6. 基环树DP(bzoj 1040: [ZJOI2008]骑士)

    树:n个点n-1条边的连通图 基环树:n个点n条边的连通图,也就是一个环套着多棵树 基环树DP:找到环上任意相邻两点,断掉这两点之间的边,就形成了一棵树 之后对这两点分别进行一次树形DP即可 例题: ...

  7. P1295 [TJOI2011]书架(线段树dp)

    P1295 [TJOI2011]书架(线段树dp) 我好菜 先考虑普通dp: d p i = m i n ( d p j + m a x ( h j + 1 , h j + 2 - , h i ) ) ...

  8. 【BZOJ1124】Mafia(POI2008)-环套树DP

    测试地址:Mafia 做法: 本题需要用到环套树DP. 按照题目构图,很显然是我们很熟悉的环套树森林.接下来我们进行分析,最后活下来一些什么人是合法的呢?观察发现,一个人的目标如果是自己那就必死,而没 ...

  9. 洛谷P2495 [SDOI2011]消耗战(虚树dp)

    P2495 [SDOI2011]消耗战 题目链接 题解: 虚树\(dp\)入门题吧.虚树的核心思想其实就是每次只保留关键点,因为关键点的dfs序的相对大小顺序和原来的树中结点dfs序的相对大小顺序都是 ...

最新文章

  1. CentOS---网络配置详解
  2. 【⚡小丑竟然是我自己⚡】安防三年,今天才知道什么是ONVIF
  3. Flask系列06--(中间件)Flask的特殊装饰器 before_request,after_request, errorhandler
  4. linux uniq命令_如何在Linux上使用uniq命令
  5. JAVA入门级教学之(简单的程序测试)
  6. mysql 缓解竞争热点_MySQL优化之缓存优化
  7. AspNetCore中使用Ocelot之 IdentityServer4(1)
  8. Visual Studio 2008下设置OpenCV
  9. php 上传乱码_php上传文件名乱码了怎么办
  10. Android接入google地图
  11. python里apply用法_python中apply函数是什么?
  12. SpringBoot海景房出租管理系统+代码讲解
  13. 阿里云上部署kafka--遇到的坑
  14. 一篇文章搞懂 Hadoop RPC 到底是什么
  15. 陕西的饮食历史和特点
  16. vue实现任务周期cron表达式选择组件
  17. 前端HTML5面试题
  18. Android 获取手机联系人代码
  19. FPGA逻辑设计回顾(10)DDR/DDR2/DDR3中的时序参数的含义
  20. 10月27号吃鸡服务器维护吗,10月27日正式服维护公告

热门文章

  1. mysql集群异地部署_linux 环境下 部署mysql 集群
  2. python 多关键字排序_用Python排序字​​典
  3. 用台式机搭建服务器测试环境_2020年十大最佳台式机环境
  4. kotlin界面_Kotlin界面
  5. TotalCommander增加回到桌面功能
  6. Java面向对象:对象的概念及面向对象的三个基本特征
  7. 深入了解如何学好C++编程
  8. C++算法工程师需要具备开发能力
  9. 如何利用C++和libCurl使用OCR SDK
  10. CS229学习笔记(1)引言、单变量线性回归