题目描述
几乎整个Byteland王国都被森林和河流所覆盖。小点的河汇聚到一起,形成了稍大点的河。就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海。这条大河的入海口处有一个村庄——名叫Bytetown。在Byteland国,有n个伐木的村庄,这些村庄都座落在河边。目前在Bytetown,有一个巨大的伐木场,它处理着全国砍下的所有木料。木料被砍下后,顺着河流而被运到Bytetown的伐木场。Byteland的国王决定,为了减少运输木料的费用,再额外地建造k个伐木场。这k个伐木场将被建在其他村庄里。这些伐木场建造后,木料就不用都被送到Bytetown了,它们可以在运输过程中第一个碰到的新伐木场被处理。显然,如果伐木场座落的那个村子就不用再付运送木料的费用了。它们可以直接被本村的伐木场处理。注:所有的河流都不会分叉,形成一棵树,根结点是Bytetown。国王的大臣计算出了每个村子每年要产多少木料,你的任务是决定在哪些村子建设伐木场能获得最小的运费。其中运费的计算方法为:每一吨木料每千米1分钱。输入输出格式
输入格式:
第一行包括两个数 n(2≤n≤100),k(1≤k≤50,且 k≤n)。n为村庄数,k为要建的伐木场的数目。除了Bytetown外,每个村子依次被命名为1,2,3……n,Bytetown被命名为0。接下来n行,每行3个整数:wi——每年i村子产的木料的块数(0≤wi≤10000)vi——离i村子下游最近的村子(即i村子的父结点)(0≤vi≤n)di——vi到i的距离(千米)。(1≤di≤10000)保证每年所有的木料流到bytetown的运费不超过2,000,000,000分50%的数据中n不超过20。输出格式:
输出最小花费,单位为分。输入输出样例
输入样例#1:
4 2
1 0 1
1 1 10
10 2 5
1 2 3
输出样例#1:
4

树上分组背包+约定祖先

#include<iostream>
#include<cstdio>
using namespace std;inline int rd() {int ret=0,f=1;char c;while(c=getchar(),!isdigit(c))f=c=='-'?-1:1;while(isdigit(c))ret=ret*10+c-'0',c=getchar();return ret*f;
}const int MAXN=155;struct Edge {int next,to,w;
} e[MAXN];
int ecnt,head[MAXN];
inline void add(int x,int y,int w) {e[++ecnt].next = head[x];e[ecnt].to = y;e[ecnt].w = w;head[x] = ecnt;
}int n,k;
int val[MAXN];
int f[MAXN][MAXN][MAXN];
int g[MAXN][MAXN][MAXN];
int stack[MAXN],top;
int dep[MAXN];void dfs(int x) {stack[++top]=x;for(int i=head[x]; i; i=e[i].next) {int v=e[i].to;dep[v]=dep[x]+e[i].w;dfs(v);for(int fa=1; fa<=top; fa++) {for(int j=k; j>=0; j--) {f[x][j][stack[fa]]+=f[v][0][stack[fa]];g[x][j][stack[fa]]+=f[v][0][x];for(int u=0; u<=j; u++) {//f[x][j][stack[fa]]=min(f[x][j][stack[fa]],f[x][j-u][stack[fa]]+f[v][u][stack[fa]]);g[x][j][stack[fa]]=min(g[x][j][stack[fa]],g[x][j-u][stack[fa]]+f[v][u][x]);}}}}for(int fa=1; fa<=top; fa++) {for(int j=0; j<=k; j++) {if(j>=1) f[x][j][stack[fa]]=min(f[x][j][stack[fa]]+val[x]*(dep[x]-dep[stack[fa]]),g[x][j-1][stack[fa]]);else f[x][j][stack[fa]]+=val[x]*(dep[x]-dep[stack[fa]]);}}top--;
}int main() {n=rd();k=rd();for(int i=1; i<=n; i++) {int y,w;val[i]=rd();y=rd();w=rd();add(y,i,w);}dfs(0);cout<<f[0][k][0];return 0;
}

[LUOGU] P3354 [IOI2005]Riv 河流相关推荐

  1. Luogu P3354 [IOI2005]Riv河流 题解———再加一维!再加一维!

    Description n≤100,k≤min(n,50)n≤100,k≤min(n,50)n≤100,k≤min(n,50). Solution 考虑树形dpdpdp. 状态设计为dpi,jdp_{ ...

  2. 洛谷P3354 [IOI2005]Riv 河流——“承诺”DP

    题目:https://www.luogu.org/problemnew/show/P3354 状态中要记录一个"承诺",只需相同承诺之间相互转移即可: 然后就是树形DP的套路了. ...

  3. 洛谷 P3354 [IOI2005]Riv 河流【树形dp】

    ... 题目: 题意: 分析: 代码: 题目: 传送门 题意: 给出一棵有nnn个节点的树,每条边有一个距离,每个点有一个权值 我们需要选出除根节点以外的kkk个节点,每个点的答案为该点的点权向上直到 ...

  4. P3354 [IOI2005]Riv 河流

    树形dp,设f[i][j][k]表示第i个点的子树中选择j个点作为伐木场,而且k是建了伐木场的最浅的i的祖先的情况下,最小的收益. 这种题还要练一下,咕咕 然后转移可以n4方做. // luogu-j ...

  5. [IOI2005]Riv 河流

    题目描述 几乎整个Byteland 王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海.这条大河的入海口处有一个村庄--B ...

  6. 『树形DP』[IOI2005]Riv 河流

    题目描述 题解 我们设f[x][j][k]f[x][j][k]f[x][j][k]表示运输完了以xxx为根的子树,iii的祖先jjj建立了伐木场,建立了kkk个伐木场的最小运输代价.由于题目中说明了0 ...

  7. [IOI2005]Riv河流

    题目链接:洛谷,BZOJ 前置知识:莫得 题解 直接考虑dp.首先想法是设状态 \(dp[u][i]\) 表示u的子树内建 \(i\) 个伐木场且子树内木头都运到某个伐木场的最小花费.发现这样的状态是 ...

  8. BZOJ.1812.[IOI2005]Riv 河流(树形背包)

    BZOJ 洛谷 这个数据范围..考虑暴力一些把各种信息都记下来.不妨直接令\(f[i][j][k][0/1]\)表示当前为点\(i\),离\(i\)最近的建了伐木场的\(i\)的祖先为\(j\),\( ...

  9. 【bzoj 1812】[Ioi2005]riv(树形dp)

    1812: [Ioi2005]riv Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 433  Solved: 246 [Submit][Status] ...

最新文章

  1. Vivado中单端口和双端口RAM的区别
  2. VS2017登陆不了,TFS无法连接成功的问题
  3. java.lang中所有的类_java.lang中的数学类
  4. 【Spring注解系列03】@Scope与@Lazy
  5. MSCI发布最新ESG评级 三七互娱位居A股游戏行业最高
  6. 如何调整mysql严谨度_如何管理 MySQL 的 binlog 收藏
  7. ActiveMQ常见操作
  8. 班迪录屏注册机(Bandicam)
  9. Qt 之 QQ系统表情—实现动态显示效果
  10. cartographer源码解析(二)node_main.cc文件详解
  11. zedboard运行linux,(转载)一步一步学ZedBoard Zynq(六):在ZedBoard上运行linux并编写linux下的应用程序HelloWorld...
  12. java 动态切换数据源_Java动态切换数据源(AOP)
  13. 百度文库推广引流技巧
  14. python爬虫---一键采集ftx网站上的所有房源信息
  15. 【学习总结】Apsara Clouder云计算技能认证:网站建设:部署与发布
  16. android township 游戏存档备份,安卓游戏存档备份与存档还原的教程(图文详细)
  17. 你可能想象不到,手机号码标记居然也是一门月赚十万的好生意
  18. 07-项目训练_流程与快递表格创建~Express Service编写
  19. 利用HashMap找出数组中出现次数最多的元素及其次数
  20. ASCII-Generator.site在线生成ASCII艺术字符图

热门文章

  1. 单位增益缓冲器的反馈路径中电阻的作用是什么?
  2. 360流量卫士android 9,360流量卫士
  3. 整合Visual C++和WDK7:Step by step
  4. 微观经济学: 鳄梨(Avocado)价格弹性分析
  5. 特斯拉充电电流设置多大_特斯拉电动汽车充电规格?
  6. 哪些情况可以判定需要进行仪器校准?
  7. 如何利用漏斗模型增加转化率减少流失率?
  8. github上能找到中文博主吗_Lyx的安装流程(windows10系统)及配置中文环境
  9. 山世光:AI产业需要赋能平台
  10. 如何在实验室服务器上跑代码