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

题目很简单,树形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. mariadb日志学习笔记

    MySQL日志: 查询日志:query log 慢查询日志: 查询执行时长超过指定时长的查询操作所记录的日志 slow query log 错误日志:包含了服务器启动和关闭的正常信息 二进制日志:包含 ...

  2. 【转】MYISAM表批量压缩

    关于对MYISAM表的压缩,可以使用myisampack和myisamchk完成(myisampack完之后必须进行myisamchk才能使用压缩后的表,而且是只读的), 其详细地用法可以参考官方文档 ...

  3. 管理员 修改MySQL 5.7.9 新版本的root密码方法以及一些新变化整理

    MySQL 5.7版本开始,增强密码验证机制,网上说安装的时候会在/root/.mysql_secret  文件中生成默认密码,这一点自 5.7.6版本以后也去掉了. 针对如果生成默认密码,网上有一个 ...

  4. jquery实现radio按纽全不选和checkbox全选的实例

    用jquery实现以下两个这个功能: 1.对所有单选按纽中radio全不选 单选按纽:<input type="radio" name="f1">A ...

  5. 09-排序2 Insert or Merge

    要点就是把排序每一步,判断一下是否和第二组数据相同,若相同则输出排序方法和下一次序列. According to Wikipedia: Insertion sort iterates, consumi ...

  6. 第十章 管理类型(In .net4.5) 之 使用反射

    1. 概述 一个.net程序不仅包含代码和数据,还包含 元数据. 本章介绍如何应用attributes以及如何使用反射来获取它,还有如何使用CodeDom和expression trees来实现在运行 ...

  7. JS实现浏览器的title闪烁

    经常可以看见的title里面的消息提示,下面是JS的一种实现方法:主要是通过setTimeout方法设置一个定时器,切换消息提示,从而达title到消息提示的闪烁. <html> < ...

  8. python小算法(一)

    1.长度为m的字符串a,长度为n的字符串b,(m>n) 判断b中的字母是否全在a中? O(n)最小. class Num(object): def getNum(self, m): numLis ...

  9. Swift :?和 !

    Swift语言使用var定义变量,但和别的语言不同,Swift里不会自动给变量赋初始值, 也就是说变量不会有默认值,所以要求使用变量之前必须要对其初始化 .如果在使用变量之前不进行初始化就会报错: v ...

  10. ext4.1动态生成多个checkboxgroup(或者radiogroup),并且有toolbar操作、

    转载自:http://blog.csdn.net/zhengyuechuan/article/details/9327291 前台controller代码: Ext.define('zyc.contr ...