说句实话,写完这道题,很想吐一口血出来,以示我心情的糟糕;

题目很简单,树形dp,正常做30分钟,硬是做了好几个小时,真是伤心。

题解不写了,只是吐个槽,网上没有用背包写的dp,全是左儿子右兄弟写法,没法对照一下,难受啊。

代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define LL long long
int n,K;
const int maxn=;
const LL inf=3000000000LL;
struct node{
int y,next,v;
}e[maxn];
int linkk[maxn],len=,w[maxn],d[maxn][maxn],siz[maxn],q[maxn],tail=,fa[maxn],ru[maxn],vis[maxn];
int read(){
int x=;char ch=getchar();bool flag=;
while(ch<''||ch>''){if(ch=='-')flag=;ch=getchar();}
while(ch<=''&&ch>=''){x=x*+ch-'';ch=getchar();}
return flag?-x:x;
}
void insert(int x,int y,int v){
e[++len].y=y;
e[len].v=v;
e[len].next=linkk[x];
linkk[x]=len;
}
void print(int x){printf("%d\n",x);}
void print(int x,int y){printf("%d %d\n",x,y);}
void init(){
int y,v;
n=read(),K=read();
memset(d,,sizeof(d));
for(int i=;i<=n;i++){
w[i]=read(),y=read(),v=read();
insert(i,y,v);insert(y,i,v);
d[i][y]=v,d[y][i]=v;
} }
void findd(){
for(int i=;i<=n;i++)d[i][i]=;
for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(d[i][k]+d[k][j]<d[i][j])d[i][j]=d[i][k]+d[k][j];
}
LL f[][][];
void dfs(int x,int f){
siz[x]=;
fa[x]=f;
for(int i=linkk[x];i;i=e[i].next){
if(e[i].y==f)continue;
dfs(e[i].y,x);
siz[x]+=siz[e[i].y];
ru[x]++;
}
if(siz[x]==)q[++tail]=x;
}
void work(){
memset(f,-,sizeof(f));
findd();
dfs(,);
for(int head=;head<=tail;head++){
int x=q[head];
ru[fa[x]]--;
if(ru[fa[x]]==)q[++tail]=fa[x];
LL g[];
for(int k=;k<=siz[x]&&k<=K;k++){
for(int prev=fa[x];prev!=-;prev=fa[prev]){ for(int p=;p<=k;p++)g[p]=;
for(int i=linkk[x];i;i=e[i].next){
if(e[i].y==fa[x])continue;
LL minn=inf;
for(int j=k;j>=;j--){
minn=inf;
for(int l=;l<=siz[e[i].y]&&l<=j;l++)
minn=min(minn,g[j-l]+f[e[i].y][l][prev]);
g[j]=minn;
}
}
LL ans=g[k]+w[x]*d[prev][x];
for(int p=;p<=k;p++)g[p]=;
for(int i=linkk[x];i;i=e[i].next){
if(e[i].y==fa[x])continue;
LL minn=inf;
for(int j=k-;j>=;j--){
minn=inf;
for(int l=;l<=siz[e[i].y]&&l<=j;l++)
minn=min(minn,g[j-l]+f[e[i].y][l][x]);
g[j]=minn;
}
}
f[x][k][prev]=min(ans,k-<?inf:g[k-]);
if(!prev)break;
}
}
}
cout<<f[][K][]<<endl;
}
int main(){
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
init();
work();
}

rivers ioi2005 树形dp的更多相关文章

  1. 【BZOJ1812】[Ioi2005]riv 树形DP

    [BZOJ1812][Ioi2005]riv Description 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了一条大河, ...

  2. BZOJ_1812_[Ioi2005]riv_树形DP

    BZOJ_1812_[Ioi2005]riv_树形DP Description 几乎整个Byteland王国都被森林和河流所覆盖.小点的河汇聚到一起,形成了稍大点的河.就这样,所有的河水都汇聚并流进了 ...

  3. poj3417 LCA + 树形dp

    Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4478   Accepted: 1292 Descripti ...

  4. COGS 2532. [HZOI 2016]树之美 树形dp

    可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...

  5. 【BZOJ-4726】Sabota? 树形DP

    4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 128  Solved ...

  6. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)

    题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...

  7. 树形DP

    切题ing!!!!! HDU  2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...

  8. BZOJ 2286 消耗战 (虚树+树形DP)

    给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...

  9. POJ2342 树形dp

    原题:http://poj.org/problem?id=2342 树形dp入门题. 我们让dp[i][0]表示第i个人不去,dp[i][1]表示第i个人去 ,根据题意我们可以很容易的得到如下递推公式 ...

随机推荐

  1. Java实现猜数游戏

    利用Math.random()方法产生1~100的随机整数,利用JOptionPane.showInputDialog()方法产生一个输入对话框,用户可以输入所猜的数.若所猜的数比随机生成的数大,则显 ...

  2. JS下高效拼装字符串的几种方法比较与测试代码

    在使用Ajax提交信息时,我可能常常需要拼装一些比较大的字符串通过XmlHttp来完成POST提交.尽管提交这样大的信息的做法看起来并不优雅,但有时我们可能不得不面对这样的需求.那么JavaScrip ...

  3. Jquery note

    the purpose: write less. do more   写得少,做更多 jquery 基本选择器, $("p ,div ")匹配所有的P元素和DIV元素 , $(&q ...

  4. 对ASP.NET Entity FrameWork进行单元测试

    添加一个测试用的类库:将Web.config中的connectionstrings节点下的东东复制一份到刚添加的类库的app.config下 使用NUint+TestDriven.net进行测试: 如 ...

  5. 【设计模式】策略模式 (Strategy Pattern)

    策略模式是一种很简单的基础模式,用于封装一系列算法,使客户端的访问独立于算法的实现.我们可以”井中取水”来形象的描述策略模式.“取水”是一个动作,完成这个动作的方式有很多中,可以直接用手提.可以用水车 ...

  6. DoubanFm之设计模式(一)

    前两版DoubanFm写的太戳,第一版可以忽略,当是熟悉WP手机的一些API.. 第二版用了比较多的依赖注入,熟悉了Messenger,过后越写越大,感觉不对,赶快打住..现在开始好好思考各模块了. ...

  7. 向plsql中导入数据

    1.TOOLS-->ODBC IMPORTER 2.TOOLS-->TEXT IMPORTER3.sqlldr userid=zj/zj@orcl control=D:\test.ctl ...

  8. golang与C交互:cgo

    1. 在Go中引用C代码很简单, 在 import "C"前用注释引入标准的C代码, 然后使用C.xxx的伪包引用C代码空间的标识符即可. 需要注意, import"C& ...

  9. System.IO之内存映射文件共享内存

    内存映射文件是利用虚拟内存把文件映射到进程的地址空间中去,在此之后进程操作文件,就 像操作进程空间里的地址一样了,比如使用c语言的memcpy等内存操作的函数.这种方法能够很好的应用在需要频繁处理一个 ...

  10. 鲁棒性是 Robustness

    鲁棒性是 Robustness 的音译,是指当系统受到不正常干扰时,是否还能保证主体功能正常运作.可参考 维基百科:http://zh.wikipedia.org/zh/ 鲁棒性 _( 计算机科学 ) ...