趁魏佬去英语演讲了,赶快%%%%%%%%%%%%%%魏佬

基本上是照着魏佬的代码写的

这其实还是一个树上背包

我们用\(dp[i][j][k]\)表示在以\(i\)为根的子树里,我们修建\(k\)个伐木场,且\(i\)这个节点的树木我们运到\(j\),也就是说在\(j\)上修建了一个伐木场,但是这个\(j\)并不包含在\(k\)中,除非\(j=i\)

显然这又变成一个树上背包了

具体看注释吧

#include<iostream>
#include<cstring>
#include<cstdio>
#define re register
#define maxn 105
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define LL long long
#define INF 9999999999
struct E
{
int v,nxt,w;
}e[maxn<<1];
int n,m,num,sz;
int st[maxn];
int deep[maxn],head[maxn];
LL c[maxn];
int sum[maxn];
LL pre[maxn];
LL dp[maxn][maxn][55];
inline LL read()
{
char c=getchar();
LL x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
inline void add_edge(int x,int y,int z)
{
e[++num].v=y;
e[num].nxt=head[x];
e[num].w=z;
head[x]=num;
}
void dfs(int x)
{
st[++sz]=x;//开一个栈来存储x节点到根路径上所有的点
sum[x]=1;
for(re int i=head[x];i;i=e[i].nxt)
if(!deep[e[i].v])
{
deep[e[i].v]=deep[x]+1;
pre[e[i].v]=pre[x]+e[i].w;
dfs(e[i].v);
sum[x]+=sum[e[i].v];
for(re int j=1;j<=sz;j++)
{
for(re int k=min(sum[x],m);k>=0;k--)//倒序枚举,01背包
{
LL mid=INF;
for(re int p=0;p<=k;p++)//枚举子树里选多少个
mid=min(mid,dp[x][st[j]][k-p]+min(dp[e[i].v][e[i].v][p],dp[e[i].v][st[j]][p]));//儿子可以将自己的运到st[j],也可以就地解决
dp[x][st[j]][k]=mid;
}
}
}
for(re int j=1;j<=sz;j++)
for(re int k=0;k<=min(sum[x],m);k++)
dp[x][st[j]][k]+=(pre[x]-pre[st[j]])*c[x];
for(re int k=min(sum[x],m);k;--k)
dp[x][x][k]=dp[x][x][k-1];//在就地解决这种情况里,我们没有算上x上建的那个伐木场,于是在这里更新一下
dp[x][x][0]=INF;
sz--;
}
int main()
{
n=read(),m=read()+1;
int fa,z;
for(re int i=1;i<=n;i++)
{
c[i]=read(),fa=read(),z=read();
add_edge(fa,i,z);
}
deep[0]=1;
dfs(0);
printf("%lld\n",dp[0][0][m]);
return 0;
}

【[IOI2005]Riv 河流】的更多相关文章

  1. [LUOGU] P3354 [IOI2005]Riv 河流

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

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

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

  3. P3354 [IOI2005]Riv 河流

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

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

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

  5. [IOI2005]Riv 河流

    https://www.zybuluo.com/ysner/note/1300088 题面 有一棵\(n\)个点的树,现在在上面放\(k\)个标记,使得每个点的权值乘上自己到最近的标记祖先的距离的和最 ...

  6. bzoj1812 [IOI2005]riv河流

    题目链接 problem 给出一棵树,每个点有点权,每条边有边权.0号点为根,每个点的代价是这个点的点权\(\times\)该点到根路径上的边权和. 现在可以选择最多K个点.使得每个点的代价变为:这个 ...

  7. [IOI2005]Riv河流

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

  8. BZOJ 1812: [Ioi2005]riv( 树形dp )

    树背包, 左儿子右兄弟来表示树, dp(x, y, z)表示结点x, x的子树及x的部分兄弟共建y个伐木场, 离x最近的伐木场是z时的最小代价. 时间复杂度O(N^2*K^2) ----------- ...

  9. 1812: [Ioi2005]riv

    1812: [Ioi2005]riv Time Limit: 10 Sec Memory Limit: 64 MB Submit: 635 Solved: 388 [Submit][Status][D ...

随机推荐

  1. 撩课-Java每天10道面试题第4天

    撩课Java+系统架构 视频 点击开始学习 31.静态变量和实例变量的区别? 静态变量也叫类变量, 这种变量前加了static修饰符. 可以直接用类名调用, 也可以用对象调用, 而且所有对象的同一个类 ...

  2. DB2 Metadata

    http://www.devart.com/dotconnect/db2/docs/MetaData.html Instead of specifying the metadata collectio ...

  3. js比较好的一些方法

    js里面有些方法比较容易忘记,但却很实用,很好用的一些方法.在此记录: 1.Math.ceil(x) — 返回大于等于数字参数的最小整数(取整函数),对数字进行上舍入 2.Math.floor(x)– ...

  4. git 远程代码回退

    git reflog git reset --hard commitId git push -f

  5. Linux 安装命令

  6. 使用input做简单的上传图片

    css 代码: .container{ width: 200px; height: 200px; border: 1px solid #666; } HTML 代码: <input type=& ...

  7. Apache 2 解析html中的php

    Ubuntu下安装Apache 2无法解析html中的php Ubuntu下安装了Apache 2却无法解析html中的php ,好多说是在httpd.conf文件中修改代码,但是ubuntu中没有这 ...

  8. Android 录制视频

    Activity代码: package eoe.demo.Media; import java.io.File; import java.io.IOException; import android. ...

  9. 上海ctf2017 pwn100 && pwn200

    前言 分析的 idb 文件在这: https://gitee.com/hac425/blog_data/tree/master/shanghaictf pwn100 程序是一个经典的 堆管理程序,基本 ...

  10. 菜单Menu(AS开发实战第四章学习笔记)

    4.5 菜单Menu Android的菜单主要分两种,一种是选项菜单OptionMenu,通过按菜单键或点击事件触发,另一种是上下文菜单ContextMenu,通过长按事件触发.页面的布局文件放在re ...