1812: [Ioi2005]riv

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 566  Solved: 335
[Submit][Status][Discuss]

Description

几乎整个Byteland王国都被森林和河流所覆盖。小点的河汇聚到一起,形成了稍大点的河。就这样,所有的河水都汇聚并流进了一条大河,最后这条大河流进了大海。这条大河的入海口处有一个村庄——名叫Bytetown 在Byteland国,有n个伐木的村庄,这些村庄都座落在河边。目前在Bytetown,有一个巨大的伐木场,它处理着全国砍下的所有木料。木料被砍下后,顺着河流而被运到Bytetown的伐木场。Byteland的国王决定,为了减少运输木料的费用,再额外地建造k个伐木场。这k个伐木场将被建在其他村庄里。这些伐木场建造后,木料就不用都被送到Bytetown了,它们可以在 运输过程中第一个碰到的新伐木场被处理。显然,如果伐木场座落的那个村子就不用再付运送木料的费用了。它们可以直接被本村的伐木场处理。 注意:所有的河流都不会分叉,也就是说,每一个村子,顺流而下都只有一条路——到bytetown。 国王的大臣计算出了每个村子每年要产多少木料,你的任务是决定在哪些村子建设伐木场能获得最小的运费。其中运费的计算方法为:每一块木料每千米1分钱。 编一个程序: 1.从文件读入村子的个数,另外要建设的伐木场的数目,每年每个村子产的木料的块数以及河流的描述。 2.计算最小的运费并输出。

Input

第一行 包括两个数 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村子下游最近的村子(或bytetown)(0<=vi<=n) di——vi到i的距离(km)。(1<=di<=10000) 保证每年所有的木料流到bytetown的运费不超过2000,000,000分 50%的数据中n不超过20。

Output

输出最小花费,精确到分。

Sample Input

4 2
1 0 1
1 1 10
10 2 5
1 2 3

Sample Output

4

HINT

Source

这是一道树形dp题目

首先转化为左儿子右兄弟的表示方法

f[node][anc][K]表示在node节点上,最近的有贡献祖先在anc上,在node的儿子和兄弟上有k个有贡献节点的最优值

转移方程

f[node][anc][K]=min{f[son[node]][anc][k]+f[bro[node]][anc][K−k]}+Value[node]∗(dis[node]−dis[anc])无贡献

f[node][anc][K]=min{f[son[node]][node][k]+f[bro[node]][anc][K−1−k]}                                             有贡献

代码如下

#include <bits/stdc++.h>
using namespace std;
inline int read(){int x=0;int f=1;char ch=getchar();while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}return x*f;
}
const int MAXN=500;
namespace zhangenming{struct node{int y,v,next;}e[MAXN];int linkk[MAXN],fa[MAXN],bra[MAXN],dis[MAXN],pre_fa[MAXN],son[MAXN],value[MAXN],N,K,len=0;int  f[110][110][110];inline void insert(int xx,int yy,int vv){e[++len].y=yy;e[len].next=linkk[xx];e[len].v=vv;linkk[xx]=len;}void dfs(int node){for(int i=linkk[node];i;i=e[i].next){dis[e[i].y]=dis[node]+e[i].v;dfs(e[i].y);}}void build(int father,int node){int tmp=linkk[node];fa[node]=father;son[node]=e[tmp].y;if(tmp) build(node,e[tmp].y);node=e[tmp].y;for(int i=e[tmp].next;i;i=e[i].next){bra[node]=e[i].y;build(node,e[i].y);node=e[i].y;}}void init(){N=read();K=read();for(int i=1;i<=N;i++){value[i]=read();int xx=read();int yy=read();insert(xx,i,yy);pre_fa[i]=xx;}pre_fa[0]=-1;dfs(0);dis[0]=0;build(-1,0);}void tree_dp(int node){if(son[node]){tree_dp(son[node]);}if(bra[node]){tree_dp(bra[node]);}int father=pre_fa[node];while(father!=-1){for(int i=0;i<=K;i++){for(int j=0;j<=i;j++){int tmp=(dis[node]-dis[father])*value[node];if(son[node]) tmp+=f[son[node]][father][j];if(bra[node]) tmp+=f[bra[node]][father][i-j];f[node][father][i]=min(f[node][father][i],tmp);}}for(int i=1;i<=K;i++){for(int j=1;j<=i;j++){int tmp=0;if(son[node]) tmp+=f[son[node]][node][j-1];if(bra[node]) tmp+=f[bra[node]][father][i-j];f[node][father][i]=min(f[node][father][i],tmp);}}father=pre_fa[father];}if(node==0){father=0;for(int i=0;i<=K;i++){for(int j=0;j<=i;j++){int tmp=0;if(son[node])tmp+=f[son[node]][father][j];if(bra[node])tmp+=f[bra[node]][father][i-j];f[node][father][i]=min(f[node][father][i],tmp);}}}}void solve(){memset(f,10,sizeof(f));tree_dp(0);cout<<f[0][0][K]<<endl;}
}
int main(){using namespace zhangenming;init();solve();return 0;
}

细节参考代码

转载于:https://www.cnblogs.com/something-for-nothing/p/7805930.html

BZOJ 1812 IOI 2005 riv相关推荐

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

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

  2. IOI 2005 Riv 河流 题解

    题目传送门 题目大意: 给出一棵树,每个点有一些木材,除了根节点外(本身就是伐木场),你需要选 kkk 个点造伐木场,每个点的木材最后会往根节点运送,如果到达了一个伐木场就停下,你要使总运费最小. 题 ...

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

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

  4. bzoj 1500 [NOI 2005] 维修数列

    题目大意不多说了 貌似每个苦逼的acmer都要做一下这个splay树的模版题目吧 还是有很多操作的,估计够以后当模版了.... 1 #include <cstdio> 2 #include ...

  5. BZOJ 1502 NOI 2005 月下柠檬树

    题目大意 给定一些圆和梯形,求它们面积的并 解答 直接用辛普森公式积分 ∫baf(x)×dx≈b−a6[f(a)+f(a+b2)+f(b)] \int_a^bf(x)\times dx \approx ...

  6. Xcode 12 Beta 3 更新记录SwiftUI2

    Xcode 12 Beta 3发行说明 更新您的应用程序以使用新功能,并针对API更改测试您的应用程序. 总览 Xcode 12 beta 3包括适用于iOS 14,iPad OS 14,tvOS 1 ...

  7. IOI前四再次被中国包揽!双满分夺金+团体第一,全员保送清华

    衡宇 发自 凹非寺 量子位 | 公众号 QbitAI 继IOI 2021之后,中国队再次包揽IOI 2022(第34届国际信息学奥林匹克竞赛)金牌前四名,并以绝对优势拿下团体第一. △中国选手闭幕式合 ...

  8. [考试]20151013搜索

    1.前言 互测题第二弹--来自YMDragon的搜索.一大堆以前正式比赛的题目,什么CTSC,HNOI和NOI云云,某些题实在不好吐槽...把搜索出在考场上还出得这么丧病. 2.match 比赛 来源 ...

  9. USACO 刷水记录

    发现一篇一篇写太麻烦了 决定向jiry学习 3 BZOJ 3446 USACO 2014 Feb GoldCow Decathlon 直接状压即可 BZOJ 1679 USACO 2005 Jan S ...

最新文章

  1. JMS ActiveMQ研究文档
  2. axure删除的页面怎么恢复_Axure如何应对意外关闭
  3. Mysql 将一张表的数据插入到另一张表中
  4. Android——SQLite实现面向对象CRUD
  5. s l m 尺码排序 php,m l xl xxl是什么意思?服装尺码s m l xl xxl含义
  6. PHP如何保存当前用户
  7. nmap常用的扫描命令
  8. 一款强大的Kubernetes API流量查看神器
  9. linux中波浪号代表什么_建筑电气施工图纸中BV、ZRBLV和TC、SC符号代表什么?
  10. Homebrew简介和基本使用
  11. oracle 日期转换成毫秒数,ORACLE:毫秒与日期的相互转换,获取某天的信息
  12. pl/mysql安装_MySQL安装
  13. CSS3 box-shadow 设置元素阴影、text-shadow 设置文本阴影
  14. 计算机二级试题17,《计算机二级考试试题及答案17》.doc
  15. 非关系数据库-NoSQL探讨
  16. matlab语法复习
  17. 《工业设计史》第九章:职业工业设计师的出现
  18. Buck电路的闭环PI控制
  19. 数学之美--读书笔记
  20. 给 30 岁左右程序员,4 个突破内卷的破局建议!

热门文章

  1. STM32单片机基于HAL库开发HC-SR04 超声波测距模块(终极版)
  2. ZYNQ从放弃到入门(八)-PS和PL交互
  3. 基于Visual C++2010 与office2010开发办公自动化(14)-自定义excel2010工具栏
  4. 【建议收藏】2021年中高级Android大厂面试秘籍,为你保驾护航金三银四,直通大厂(Java篇)
  5. mysql 同步复制 半同步复制_一文看懂MySQL的异步复制、全同步复制与半同步复制...
  6. uthash.h 哈希表怎么用
  7. BIOS和UEFI的区别,系统安装引导以及MBR和GPT磁盘分区
  8. 4、Screenshot-adb基本命令-Android
  9. JavaScript实现垃圾分类小游戏教程,附源码!
  10. 【渝粤题库】广东开放大学 跨文化交际学 形成性考核